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) {
|
if (t->state != TRANS_STARTING && t->state != TRANS_RUNNING) {
|
||||||
/* handle restoring objects */
|
/* handle restoring objects */
|
||||||
if (t->state == TRANS_CANCEL) {
|
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;
|
exit_code = OPERATOR_CANCELLED;
|
||||||
restoreTransObjects(t); // calls recalcData()
|
restoreTransObjects(t); // calls recalcData()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,8 +47,7 @@ bool clipUVTransform(TransInfo *t, float vec[2], const bool resize);
|
|||||||
void clipUVData(TransInfo *t);
|
void clipUVData(TransInfo *t);
|
||||||
|
|
||||||
/* transform_convert_mesh.c */
|
/* transform_convert_mesh.c */
|
||||||
void trans_mesh_customdata_correction_init(TransInfo *t);
|
void trans_mesh_customdata_correction_init(TransInfo *t, struct TransDataContainer *tc);
|
||||||
void trans_mesh_customdata_correction_apply(struct TransDataContainer *tc, bool is_final);
|
|
||||||
|
|
||||||
/* transform_convert_sequencer.c */
|
/* transform_convert_sequencer.c */
|
||||||
int transform_convert_sequencer_get_snap_bound(TransInfo *t);
|
int transform_convert_sequencer_get_snap_bound(TransInfo *t);
|
||||||
|
|||||||
@@ -1070,105 +1070,99 @@ static void create_trans_vert_customdata_layer(BMVert *v,
|
|||||||
BLI_ghash_insert(tcld->origverts, v, r_tcld_vert);
|
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.data) {
|
/* Custom data correction has initiated before. */
|
||||||
if (tc->custom.type.free_cb == trans_mesh_customdata_free_cb) {
|
BLI_assert(tc->custom.type.free_cb == trans_mesh_customdata_free_cb);
|
||||||
/* Custom data correction has initiated before. */
|
return;
|
||||||
continue;
|
}
|
||||||
}
|
int i;
|
||||||
else {
|
|
||||||
BLI_assert(false);
|
BMEditMesh *em = BKE_editmesh_from_object(tc->obedit);
|
||||||
}
|
BMesh *bm = em->bm;
|
||||||
|
|
||||||
|
bool use_origfaces;
|
||||||
|
int cd_loop_mdisp_offset;
|
||||||
|
{
|
||||||
|
const bool has_layer_math = CustomData_has_math(&bm->ldata);
|
||||||
|
cd_loop_mdisp_offset = CustomData_get_offset(&bm->ldata, CD_MDISPS);
|
||||||
|
if ((t->settings->uvcalc_flag & UVCALC_TRANSFORM_CORRECT) &&
|
||||||
|
/* don't do this at all for non-basis shape keys, too easy to
|
||||||
|
* accidentally break uv maps or vertex colors then */
|
||||||
|
(bm->shapenr <= 1) && (has_layer_math || (cd_loop_mdisp_offset != -1))) {
|
||||||
|
use_origfaces = true;
|
||||||
}
|
}
|
||||||
int i;
|
else {
|
||||||
|
use_origfaces = false;
|
||||||
|
cd_loop_mdisp_offset = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BMEditMesh *em = BKE_editmesh_from_object(tc->obedit);
|
if (use_origfaces) {
|
||||||
BMesh *bm = em->bm;
|
/* create copies of faces for customdata projection */
|
||||||
|
bmesh_edit_begin(bm, BMO_OPTYPE_FLAG_UNTAN_MULTIRES);
|
||||||
|
|
||||||
bool use_origfaces;
|
struct GHash *origfaces = BLI_ghash_ptr_new(__func__);
|
||||||
int cd_loop_mdisp_offset;
|
struct BMesh *bm_origfaces = BM_mesh_create(&bm_mesh_allocsize_default,
|
||||||
|
&((struct BMeshCreateParams){
|
||||||
|
.use_toolflags = false,
|
||||||
|
}));
|
||||||
|
|
||||||
|
/* we need to have matching customdata */
|
||||||
|
BM_mesh_copy_init_customdata(bm_origfaces, bm, NULL);
|
||||||
|
|
||||||
|
int *layer_math_map = NULL;
|
||||||
|
int layer_index_dst = 0;
|
||||||
{
|
{
|
||||||
const bool has_layer_math = CustomData_has_math(&bm->ldata);
|
/* TODO: We don't need `sod->layer_math_map` when there are no loops linked
|
||||||
cd_loop_mdisp_offset = CustomData_get_offset(&bm->ldata, CD_MDISPS);
|
* to one of the sliding vertices. */
|
||||||
if ((t->settings->uvcalc_flag & UVCALC_TRANSFORM_CORRECT) &&
|
if (CustomData_has_math(&bm->ldata)) {
|
||||||
/* don't do this at all for non-basis shape keys, too easy to
|
/* over alloc, only 'math' layers are indexed */
|
||||||
* accidentally break uv maps or vertex colors then */
|
layer_math_map = MEM_mallocN(bm->ldata.totlayer * sizeof(int), __func__);
|
||||||
(bm->shapenr <= 1) && (has_layer_math || (cd_loop_mdisp_offset != -1))) {
|
for (i = 0; i < bm->ldata.totlayer; i++) {
|
||||||
use_origfaces = true;
|
if (CustomData_layer_has_math(&bm->ldata, i)) {
|
||||||
}
|
layer_math_map[layer_index_dst++] = i;
|
||||||
else {
|
|
||||||
use_origfaces = false;
|
|
||||||
cd_loop_mdisp_offset = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (use_origfaces) {
|
|
||||||
/* create copies of faces for customdata projection */
|
|
||||||
bmesh_edit_begin(bm, BMO_OPTYPE_FLAG_UNTAN_MULTIRES);
|
|
||||||
|
|
||||||
struct GHash *origfaces = BLI_ghash_ptr_new(__func__);
|
|
||||||
struct BMesh *bm_origfaces = BM_mesh_create(&bm_mesh_allocsize_default,
|
|
||||||
&((struct BMeshCreateParams){
|
|
||||||
.use_toolflags = false,
|
|
||||||
}));
|
|
||||||
|
|
||||||
/* we need to have matching customdata */
|
|
||||||
BM_mesh_copy_init_customdata(bm_origfaces, bm, NULL);
|
|
||||||
|
|
||||||
int *layer_math_map = NULL;
|
|
||||||
int layer_index_dst = 0;
|
|
||||||
{
|
|
||||||
/* TODO: We don't need `sod->layer_math_map` when there are no loops linked
|
|
||||||
* to one of the sliding vertices. */
|
|
||||||
if (CustomData_has_math(&bm->ldata)) {
|
|
||||||
/* over alloc, only 'math' layers are indexed */
|
|
||||||
layer_math_map = MEM_mallocN(bm->ldata.totlayer * sizeof(int), __func__);
|
|
||||||
for (i = 0; i < bm->ldata.totlayer; i++) {
|
|
||||||
if (CustomData_layer_has_math(&bm->ldata, i)) {
|
|
||||||
layer_math_map[layer_index_dst++] = i;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
BLI_assert(layer_index_dst != 0);
|
|
||||||
}
|
}
|
||||||
|
BLI_assert(layer_index_dst != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct TransCustomDataLayer *tcld;
|
|
||||||
tc->custom.type.data = tcld = MEM_mallocN(sizeof(*tcld), __func__);
|
|
||||||
tc->custom.type.free_cb = trans_mesh_customdata_free_cb;
|
|
||||||
|
|
||||||
tcld->bm = bm;
|
|
||||||
tcld->origfaces = origfaces;
|
|
||||||
tcld->bm_origfaces = bm_origfaces;
|
|
||||||
tcld->cd_loop_mdisp_offset = cd_loop_mdisp_offset;
|
|
||||||
tcld->layer_math_map = layer_math_map;
|
|
||||||
tcld->layer_math_map_num = layer_index_dst;
|
|
||||||
tcld->arena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, __func__);
|
|
||||||
|
|
||||||
int data_len = tc->data_len + tc->data_mirror_len;
|
|
||||||
struct GHash *origverts = BLI_ghash_ptr_new_ex(__func__, data_len);
|
|
||||||
tcld->origverts = origverts;
|
|
||||||
|
|
||||||
struct TransCustomDataLayerVert *tcld_vert, *tcld_vert_iter;
|
|
||||||
tcld_vert = BLI_memarena_alloc(tcld->arena, data_len * sizeof(*tcld_vert));
|
|
||||||
tcld_vert_iter = &tcld_vert[0];
|
|
||||||
|
|
||||||
TransData *tob;
|
|
||||||
for (i = tc->data_len, tob = tc->data; i--; tob++, tcld_vert_iter++) {
|
|
||||||
BMVert *v = tob->extra;
|
|
||||||
create_trans_vert_customdata_layer(v, tcld, tcld_vert_iter);
|
|
||||||
}
|
|
||||||
|
|
||||||
TransDataMirror *td_mirror = tc->data_mirror;
|
|
||||||
for (i = tc->data_mirror_len; i--; td_mirror++, tcld_vert_iter++) {
|
|
||||||
BMVert *v = td_mirror->extra;
|
|
||||||
create_trans_vert_customdata_layer(v, tcld, tcld_vert_iter);
|
|
||||||
}
|
|
||||||
|
|
||||||
tcld->data = tcld_vert;
|
|
||||||
tcld->data_len = data_len;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct TransCustomDataLayer *tcld;
|
||||||
|
tc->custom.type.data = tcld = MEM_mallocN(sizeof(*tcld), __func__);
|
||||||
|
tc->custom.type.free_cb = trans_mesh_customdata_free_cb;
|
||||||
|
|
||||||
|
tcld->bm = bm;
|
||||||
|
tcld->origfaces = origfaces;
|
||||||
|
tcld->bm_origfaces = bm_origfaces;
|
||||||
|
tcld->cd_loop_mdisp_offset = cd_loop_mdisp_offset;
|
||||||
|
tcld->layer_math_map = layer_math_map;
|
||||||
|
tcld->layer_math_map_num = layer_index_dst;
|
||||||
|
tcld->arena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, __func__);
|
||||||
|
|
||||||
|
int data_len = tc->data_len + tc->data_mirror_len;
|
||||||
|
struct GHash *origverts = BLI_ghash_ptr_new_ex(__func__, data_len);
|
||||||
|
tcld->origverts = origverts;
|
||||||
|
|
||||||
|
struct TransCustomDataLayerVert *tcld_vert, *tcld_vert_iter;
|
||||||
|
tcld_vert = BLI_memarena_alloc(tcld->arena, data_len * sizeof(*tcld_vert));
|
||||||
|
tcld_vert_iter = &tcld_vert[0];
|
||||||
|
|
||||||
|
TransData *tob;
|
||||||
|
for (i = tc->data_len, tob = tc->data; i--; tob++, tcld_vert_iter++) {
|
||||||
|
BMVert *v = tob->extra;
|
||||||
|
create_trans_vert_customdata_layer(v, tcld, tcld_vert_iter);
|
||||||
|
}
|
||||||
|
|
||||||
|
TransDataMirror *td_mirror = tc->data_mirror;
|
||||||
|
for (i = tc->data_mirror_len; i--; td_mirror++, tcld_vert_iter++) {
|
||||||
|
BMVert *v = td_mirror->extra;
|
||||||
|
create_trans_vert_customdata_layer(v, tcld, tcld_vert_iter);
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
struct TransCustomDataLayer *tcld = tc->custom.type.data;
|
||||||
if (!tcld) {
|
if (!tcld) {
|
||||||
@@ -1387,11 +1381,10 @@ void recalcData_mesh(TransInfo *t)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (t->mode == TFM_EDGE_SLIDE) {
|
if (ELEM(t->mode, TFM_EDGE_SLIDE, TFM_VERT_SLIDE)) {
|
||||||
projectEdgeSlideData(t, false);
|
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) {
|
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)
|
void special_aftertrans_update__mesh(bContext *UNUSED(C), TransInfo *t)
|
||||||
{
|
{
|
||||||
const bool canceled = (t->state == TRANS_CANCEL);
|
const bool canceled = (t->state == TRANS_CANCEL);
|
||||||
if (t->mode == TFM_EDGE_SLIDE) {
|
|
||||||
/* handle multires re-projection, done
|
if (canceled) {
|
||||||
* on transform completion since it's
|
/* Exception, edge slide transformed UVs too. */
|
||||||
* really slow -joeedh */
|
if (t->mode == TFM_EDGE_SLIDE) {
|
||||||
projectEdgeSlideData(t, !canceled);
|
doEdgeSlide(t, 0.0f);
|
||||||
|
}
|
||||||
|
else if (t->mode == TFM_VERT_SLIDE) {
|
||||||
|
doVertSlide(t, 0.0f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (t->mode == TFM_VERT_SLIDE) {
|
|
||||||
/* as above */
|
if (ELEM(t->mode, TFM_EDGE_SLIDE, TFM_VERT_SLIDE)) {
|
||||||
projectVertSlideData(t, !canceled);
|
/* 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;
|
bool use_automerge = !canceled && (t->flag & (T_AUTOMERGE | T_AUTOSPLIT)) != 0;
|
||||||
|
|||||||
@@ -94,7 +94,6 @@ void initNormalRotation(TransInfo *t);
|
|||||||
void initSeqSlide(TransInfo *t);
|
void initSeqSlide(TransInfo *t);
|
||||||
|
|
||||||
/* transform_mode_edge_slide.c */
|
/* transform_mode_edge_slide.c */
|
||||||
void projectEdgeSlideData(TransInfo *t, bool is_final);
|
|
||||||
void drawEdgeSlide(TransInfo *t);
|
void drawEdgeSlide(TransInfo *t);
|
||||||
void doEdgeSlide(TransInfo *t, float perc);
|
void doEdgeSlide(TransInfo *t, float perc);
|
||||||
void initEdgeSlide_ex(
|
void initEdgeSlide_ex(
|
||||||
@@ -153,7 +152,6 @@ void initTrackball(TransInfo *t);
|
|||||||
void initTranslation(TransInfo *t);
|
void initTranslation(TransInfo *t);
|
||||||
|
|
||||||
/* transform_mode_vert_slide.c */
|
/* transform_mode_vert_slide.c */
|
||||||
void projectVertSlideData(TransInfo *t, bool is_final);
|
|
||||||
void drawVertSlide(TransInfo *t);
|
void drawVertSlide(TransInfo *t);
|
||||||
void doVertSlide(TransInfo *t, float perc);
|
void doVertSlide(TransInfo *t, float perc);
|
||||||
void initVertSlide_ex(TransInfo *t, bool use_even, bool flipped, bool use_clamp);
|
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);
|
BMEditMesh *em = BKE_editmesh_from_object(tc->obedit);
|
||||||
BMesh *bm = em->bm;
|
BMesh *bm = em->bm;
|
||||||
@@ -554,8 +554,9 @@ static bool createEdgeSlideVerts_double_side(TransInfo *t, TransDataContainer *t
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (numsel == 0 || numsel > 2) {
|
if (numsel == 0 || numsel > 2) {
|
||||||
|
/* Invalid edge selection. */
|
||||||
MEM_freeN(sld);
|
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)) {
|
if (!BM_edge_is_manifold(e) && !BM_edge_is_boundary(e)) {
|
||||||
/* can edges with at least once face user */
|
/* can edges with at least once face user */
|
||||||
MEM_freeN(sld);
|
MEM_freeN(sld);
|
||||||
return false;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -595,7 +596,7 @@ static bool createEdgeSlideVerts_double_side(TransInfo *t, TransDataContainer *t
|
|||||||
if (!j) {
|
if (!j) {
|
||||||
MEM_freeN(sld);
|
MEM_freeN(sld);
|
||||||
MEM_freeN(sv_table);
|
MEM_freeN(sv_table);
|
||||||
return false;
|
return NULL;
|
||||||
}
|
}
|
||||||
sv_tot = j;
|
sv_tot = j;
|
||||||
}
|
}
|
||||||
@@ -870,18 +871,16 @@ static bool createEdgeSlideVerts_double_side(TransInfo *t, TransDataContainer *t
|
|||||||
calcEdgeSlide_even(t, tc, sld, mval);
|
calcEdgeSlide_even(t, tc, sld, mval);
|
||||||
}
|
}
|
||||||
|
|
||||||
tc->custom.mode.data = sld;
|
|
||||||
|
|
||||||
MEM_freeN(sv_table);
|
MEM_freeN(sv_table);
|
||||||
|
|
||||||
return true;
|
return sld;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A simple version of #createEdgeSlideVerts_double_side
|
* A simple version of #createEdgeSlideVerts_double_side
|
||||||
* Which assumes the longest unselected.
|
* 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);
|
BMEditMesh *em = BKE_editmesh_from_object(tc->obedit);
|
||||||
BMesh *bm = em->bm;
|
BMesh *bm = em->bm;
|
||||||
@@ -933,7 +932,7 @@ static bool createEdgeSlideVerts_single_side(TransInfo *t, TransDataContainer *t
|
|||||||
|
|
||||||
if (!j) {
|
if (!j) {
|
||||||
MEM_freeN(sld);
|
MEM_freeN(sld);
|
||||||
return false;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
sv_tot = j;
|
sv_tot = j;
|
||||||
@@ -1055,24 +1054,9 @@ static bool createEdgeSlideVerts_single_side(TransInfo *t, TransDataContainer *t
|
|||||||
calcEdgeSlide_even(t, tc, sld, mval);
|
calcEdgeSlide_even(t, tc, sld, mval);
|
||||||
}
|
}
|
||||||
|
|
||||||
tc->custom.mode.data = sld;
|
|
||||||
|
|
||||||
MEM_freeN(sv_table);
|
MEM_freeN(sv_table);
|
||||||
|
|
||||||
return true;
|
return sld;
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void freeEdgeSlideVerts(TransInfo *UNUSED(t),
|
static void freeEdgeSlideVerts(TransInfo *UNUSED(t),
|
||||||
@@ -1450,12 +1434,14 @@ void initEdgeSlide_ex(
|
|||||||
|
|
||||||
if (use_double_side) {
|
if (use_double_side) {
|
||||||
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
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) {
|
||||||
else {
|
tc->custom.mode.data = sld;
|
||||||
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
tc->custom.mode.free_cb = freeEdgeSlideVerts;
|
||||||
ok |= createEdgeSlideVerts_single_side(t, tc);
|
trans_mesh_customdata_correction_init(t, tc);
|
||||||
|
ok = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1464,16 +1450,6 @@ void initEdgeSlide_ex(
|
|||||||
return;
|
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 */
|
/* set custom point first if you want value to be initialized by init */
|
||||||
calcEdgeSlideCustomPoints(t);
|
calcEdgeSlideCustomPoints(t);
|
||||||
initMouseInputMode(t, &t->mouse, INPUT_CUSTOM_RATIO_FLIP);
|
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);
|
BMEditMesh *em = BKE_editmesh_from_object(tc->obedit);
|
||||||
BMesh *bm = em->bm;
|
BMesh *bm = em->bm;
|
||||||
@@ -234,7 +234,7 @@ static bool createVertSlideVerts(TransInfo *t, TransDataContainer *tc)
|
|||||||
|
|
||||||
if (!j) {
|
if (!j) {
|
||||||
MEM_freeN(sld);
|
MEM_freeN(sld);
|
||||||
return false;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
sv_array = MEM_callocN(sizeof(TransDataVertSlideVert) * j, "sv_array");
|
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->sv = sv_array;
|
||||||
sld->totsv = j;
|
sld->totsv = j;
|
||||||
|
|
||||||
tc->custom.mode.data = sld;
|
|
||||||
|
|
||||||
/* most likely will be set below */
|
/* most likely will be set below */
|
||||||
unit_m4(sld->proj_mat);
|
unit_m4(sld->proj_mat);
|
||||||
|
|
||||||
@@ -288,13 +286,7 @@ static bool createVertSlideVerts(TransInfo *t, TransDataContainer *tc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX, calc vert slide across all objects */
|
return sld;
|
||||||
if (tc == t->data_container) {
|
|
||||||
calcVertSlideMouseActiveVert(t, t->mval);
|
|
||||||
calcVertSlideMouseActiveEdges(t, t->mval);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void freeVertSlideVerts(TransInfo *UNUSED(t),
|
static void freeVertSlideVerts(TransInfo *UNUSED(t),
|
||||||
@@ -381,13 +373,6 @@ static eRedrawFlag handleEventVertSlide(struct TransInfo *t, const struct wmEven
|
|||||||
return TREDRAW_NOTHING;
|
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)
|
void drawVertSlide(TransInfo *t)
|
||||||
{
|
{
|
||||||
if ((t->mode == TFM_VERT_SLIDE) && TRANS_DATA_CONTAINER_FIRST_OK(t)->custom.mode.data) {
|
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;
|
bool ok = false;
|
||||||
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
||||||
ok |= createVertSlideVerts(t, tc);
|
VertSlideData *sld = createVertSlideVerts(t, tc);
|
||||||
VertSlideData *sld = tc->custom.mode.data;
|
|
||||||
if (sld) {
|
if (sld) {
|
||||||
|
tc->custom.mode.data = sld;
|
||||||
tc->custom.mode.free_cb = freeVertSlideVerts;
|
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;
|
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 */
|
/* set custom point first if you want value to be initialized by init */
|
||||||
calcVertSlideCustomPoints(t);
|
calcVertSlideCustomPoints(t);
|
||||||
|
|||||||
Reference in New Issue
Block a user