Merge branch 'master' into refactor-mesh-sharp-face-generic
This commit is contained in:
commit
6f135dc0a0
|
@ -66,14 +66,14 @@ typedef struct EdgeSlideData {
|
|||
|
||||
int mval_start[2], mval_end[2];
|
||||
int curr_sv_index;
|
||||
|
||||
/** when un-clamped - use this index: #TransDataEdgeSlideVert.dir_side */
|
||||
int curr_side_unclamp;
|
||||
} EdgeSlideData;
|
||||
|
||||
typedef struct EdgeSlideParams {
|
||||
float perc;
|
||||
|
||||
/** when un-clamped - use this index: #TransDataEdgeSlideVert.dir_side */
|
||||
int curr_side_unclamp;
|
||||
|
||||
bool use_even;
|
||||
bool flipped;
|
||||
} EdgeSlideParams;
|
||||
|
@ -1198,7 +1198,7 @@ void drawEdgeSlide(TransInfo *t)
|
|||
immEnd();
|
||||
}
|
||||
else if (is_clamp == false) {
|
||||
const int side_index = sld->curr_side_unclamp;
|
||||
const int side_index = slp->curr_side_unclamp;
|
||||
TransDataEdgeSlideVert *sv;
|
||||
int i;
|
||||
const int alpha_shade = -160;
|
||||
|
@ -1235,7 +1235,7 @@ void drawEdgeSlide(TransInfo *t)
|
|||
const int alpha_shade = -160;
|
||||
|
||||
float co_dir[3];
|
||||
add_v3_v3v3(co_dir, curr_sv->v_co_orig, curr_sv->dir_side[sld->curr_side_unclamp]);
|
||||
add_v3_v3v3(co_dir, curr_sv->v_co_orig, curr_sv->dir_side[slp->curr_side_unclamp]);
|
||||
|
||||
GPU_line_width(line_size);
|
||||
immUniformThemeColorShadeAlpha(TH_EDGE_SELECT, 80, alpha_shade);
|
||||
|
@ -1284,7 +1284,7 @@ static void edge_slide_snap_apply(TransInfo *t, float *value)
|
|||
side_index = perc < 0.0f;
|
||||
}
|
||||
else {
|
||||
side_index = sld_active->curr_side_unclamp;
|
||||
side_index = slp->curr_side_unclamp;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -1336,57 +1336,30 @@ static void edge_slide_snap_apply(TransInfo *t, float *value)
|
|||
*value = perc;
|
||||
}
|
||||
|
||||
static void doEdgeSlide(TransInfo *t, float perc)
|
||||
static void edge_slide_apply_elem(const TransDataEdgeSlideVert *sv,
|
||||
const float fac,
|
||||
const float curr_length_fac,
|
||||
const int curr_side_unclamp,
|
||||
const bool use_clamp,
|
||||
const bool use_even,
|
||||
const bool use_flip,
|
||||
float r_co[3])
|
||||
{
|
||||
EdgeSlideParams *slp = t->custom.mode.data;
|
||||
EdgeSlideData *sld_active = edgeSlideFirstGet(t);
|
||||
copy_v3_v3(r_co, sv->v_co_orig);
|
||||
|
||||
slp->perc = perc;
|
||||
|
||||
if (slp->use_even == false) {
|
||||
const bool is_clamp = !(t->flag & T_ALT_TRANSFORM);
|
||||
if (is_clamp) {
|
||||
const int side_index = (perc < 0.0f);
|
||||
const float perc_final = fabsf(perc);
|
||||
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
||||
EdgeSlideData *sld = tc->custom.mode.data;
|
||||
|
||||
if (sld == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
TransDataEdgeSlideVert *sv = sld->sv;
|
||||
for (int i = 0; i < sld->totsv; i++, sv++) {
|
||||
madd_v3_v3v3fl(sv->v->co, sv->v_co_orig, sv->dir_side[side_index], perc_final);
|
||||
}
|
||||
sld->curr_side_unclamp = side_index;
|
||||
}
|
||||
if (use_even == false) {
|
||||
if (use_clamp) {
|
||||
const int side_index = (fac < 0.0f);
|
||||
const float fac_final = fabsf(fac);
|
||||
madd_v3_v3fl(r_co, sv->dir_side[side_index], fac_final);
|
||||
}
|
||||
else {
|
||||
const float perc_init = fabsf(perc) *
|
||||
((sld_active->curr_side_unclamp == (perc < 0.0f)) ? 1 : -1);
|
||||
const int side_index = sld_active->curr_side_unclamp;
|
||||
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
||||
EdgeSlideData *sld = tc->custom.mode.data;
|
||||
|
||||
if (sld == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
TransDataEdgeSlideVert *sv = sld->sv;
|
||||
for (int i = 0; i < sld->totsv; i++, sv++) {
|
||||
float dir_flip[3];
|
||||
float perc_final = perc_init;
|
||||
if (!is_zero_v3(sv->dir_side[side_index])) {
|
||||
copy_v3_v3(dir_flip, sv->dir_side[side_index]);
|
||||
}
|
||||
else {
|
||||
copy_v3_v3(dir_flip, sv->dir_side[!side_index]);
|
||||
perc_final *= -1;
|
||||
}
|
||||
madd_v3_v3v3fl(sv->v->co, sv->v_co_orig, dir_flip, perc_final);
|
||||
}
|
||||
int side_index = curr_side_unclamp;
|
||||
if (is_zero_v3(sv->dir_side[side_index])) {
|
||||
side_index = !side_index;
|
||||
}
|
||||
const float fac_final = (side_index == (fac < 0.0f) ? fabsf(fac) : -fabsf(fac));
|
||||
madd_v3_v3fl(r_co, sv->dir_side[side_index], fac_final);
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -1400,40 +1373,59 @@ 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_active->sv[sld_active->curr_sv_index];
|
||||
const float curr_length_perc = curr_sv->edge_len *
|
||||
(((slp->flipped ? perc : -perc) + 1.0f) / 2.0f);
|
||||
if (sv->edge_len > FLT_EPSILON) {
|
||||
float co_a[3], co_b[3];
|
||||
const float fac = min_ff(sv->edge_len, curr_length_fac) / sv->edge_len;
|
||||
|
||||
float co_a[3];
|
||||
float co_b[3];
|
||||
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]);
|
||||
|
||||
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
||||
EdgeSlideData *sld = tc->custom.mode.data;
|
||||
|
||||
if (sld == NULL) {
|
||||
continue;
|
||||
if (use_flip) {
|
||||
interp_line_v3_v3v3v3(r_co, co_b, sv->v_co_orig, co_a, fac);
|
||||
}
|
||||
|
||||
TransDataEdgeSlideVert *sv = sld->sv;
|
||||
for (int i = 0; i < sld->totsv; i++, sv++) {
|
||||
if (sv->edge_len > FLT_EPSILON) {
|
||||
const float fac = min_ff(sv->edge_len, curr_length_perc) / sv->edge_len;
|
||||
|
||||
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 (slp->flipped) {
|
||||
interp_line_v3_v3v3v3(sv->v->co, co_b, sv->v_co_orig, co_a, fac);
|
||||
}
|
||||
else {
|
||||
interp_line_v3_v3v3v3(sv->v->co, co_a, sv->v_co_orig, co_b, fac);
|
||||
}
|
||||
}
|
||||
else {
|
||||
interp_line_v3_v3v3v3(r_co, co_a, sv->v_co_orig, co_b, fac);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void doEdgeSlide(TransInfo *t, float perc)
|
||||
{
|
||||
EdgeSlideParams *slp = t->custom.mode.data;
|
||||
EdgeSlideData *sld_active = edgeSlideFirstGet(t);
|
||||
|
||||
slp->perc = perc;
|
||||
|
||||
const bool use_clamp = !(t->flag & T_ALT_TRANSFORM);
|
||||
const bool use_even = slp->use_even;
|
||||
const bool use_flip = slp->flipped;
|
||||
|
||||
const int curr_side_unclamp = slp->curr_side_unclamp;
|
||||
float curr_length_fac = 0.0f;
|
||||
if (use_even) {
|
||||
TransDataEdgeSlideVert *sv_active = &sld_active->sv[sld_active->curr_sv_index];
|
||||
curr_length_fac = sv_active->edge_len * (((use_flip ? perc : -perc) + 1.0f) / 2.0f);
|
||||
}
|
||||
else if (use_clamp) {
|
||||
slp->curr_side_unclamp = (perc < 0.0f);
|
||||
}
|
||||
|
||||
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
||||
EdgeSlideData *sld = tc->custom.mode.data;
|
||||
|
||||
if (sld == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
TransDataEdgeSlideVert *sv = sld->sv;
|
||||
for (int i = 0; i < sld->totsv; i++, sv++) {
|
||||
edge_slide_apply_elem(
|
||||
sv, perc, curr_length_fac, curr_side_unclamp, use_clamp, use_even, use_flip, sv->v->co);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void applyEdgeSlide(TransInfo *t, const int UNUSED(mval[2]))
|
||||
{
|
||||
char str[UI_MAX_DRAW_STR];
|
||||
|
|
|
@ -466,53 +466,58 @@ void drawVertSlide(TransInfo *t)
|
|||
}
|
||||
}
|
||||
|
||||
static void vert_slide_apply_elem(const TransDataVertSlideVert *sv,
|
||||
const float perc,
|
||||
const bool use_even,
|
||||
const bool use_flip,
|
||||
float r_co[3])
|
||||
{
|
||||
if (use_even == false) {
|
||||
interp_v3_v3v3(r_co, sv->co_orig_3d, sv->co_link_orig_3d[sv->co_link_curr], perc);
|
||||
}
|
||||
else {
|
||||
float dir[3];
|
||||
sub_v3_v3v3(dir, sv->co_link_orig_3d[sv->co_link_curr], sv->co_orig_3d);
|
||||
float edge_len = normalize_v3(dir);
|
||||
if (edge_len > FLT_EPSILON) {
|
||||
if (use_flip) {
|
||||
madd_v3_v3v3fl(r_co, sv->co_link_orig_3d[sv->co_link_curr], dir, -perc);
|
||||
}
|
||||
else {
|
||||
madd_v3_v3v3fl(r_co, sv->co_orig_3d, dir, perc);
|
||||
}
|
||||
}
|
||||
else {
|
||||
copy_v3_v3(r_co, sv->co_orig_3d);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void doVertSlide(TransInfo *t, float perc)
|
||||
{
|
||||
VertSlideParams *slp = t->custom.mode.data;
|
||||
|
||||
slp->perc = perc;
|
||||
|
||||
const bool use_even = slp->use_even;
|
||||
|
||||
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
|
||||
VertSlideData *sld = tc->custom.mode.data;
|
||||
if (sld == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
TransDataVertSlideVert *svlist = sld->sv, *sv;
|
||||
int i;
|
||||
|
||||
sv = svlist;
|
||||
|
||||
if (slp->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);
|
||||
}
|
||||
}
|
||||
else {
|
||||
float tperc = perc;
|
||||
if (use_even) {
|
||||
TransDataVertSlideVert *sv_curr = &sld->sv[sld->curr_sv_index];
|
||||
const float edge_len_curr = len_v3v3(sv_curr->co_orig_3d,
|
||||
sv_curr->co_link_orig_3d[sv_curr->co_link_curr]);
|
||||
const float tperc = perc * edge_len_curr;
|
||||
tperc *= edge_len_curr;
|
||||
}
|
||||
|
||||
for (i = 0; i < sld->totsv; i++, sv++) {
|
||||
float edge_len;
|
||||
float dir[3];
|
||||
|
||||
sub_v3_v3v3(dir, sv->co_link_orig_3d[sv->co_link_curr], sv->co_orig_3d);
|
||||
edge_len = normalize_v3(dir);
|
||||
|
||||
if (edge_len > FLT_EPSILON) {
|
||||
if (slp->flipped) {
|
||||
madd_v3_v3v3fl(sv->v->co, sv->co_link_orig_3d[sv->co_link_curr], dir, -tperc);
|
||||
}
|
||||
else {
|
||||
madd_v3_v3v3fl(sv->v->co, sv->co_orig_3d, dir, tperc);
|
||||
}
|
||||
}
|
||||
else {
|
||||
copy_v3_v3(sv->v->co, sv->co_orig_3d);
|
||||
}
|
||||
}
|
||||
TransDataVertSlideVert *sv = sld->sv;
|
||||
for (int i = 0; i < sld->totsv; i++, sv++) {
|
||||
vert_slide_apply_elem(sv, tperc, use_even, slp->flipped, sv->v->co);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue