Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/transform/transform.c
- This file is larger than 256 KB, so syntax highlighting is disabled by default.
| Show First 20 Lines • Show All 6,697 Lines • ▼ Show 20 Lines | |||||
| /** \} */ | /** \} */ | ||||
| /* -------------------------------------------------------------------- */ | /* -------------------------------------------------------------------- */ | ||||
| /* Transform (Edge Slide) */ | /* Transform (Edge Slide) */ | ||||
| /** \name Transform Edge Slide | /** \name Transform Edge Slide | ||||
| * \{ */ | * \{ */ | ||||
| /** | |||||
| * Get the first valid EdgeSlideData. | |||||
| * | |||||
| * Note we cannot trust TRANS_DATA_CONTAINER_FIRST_OK because of multi-object that | |||||
| * may leave items with invalid custom data in the transform data container. | |||||
| */ | |||||
| static EdgeSlideData *edgeSlideFirstGet(TransInfo *t) | |||||
| { | |||||
| FOREACH_TRANS_DATA_CONTAINER (t, tc) { | |||||
| EdgeSlideData *sld = tc->custom.mode.data; | |||||
| if (sld == NULL) { | |||||
| continue; | |||||
| } | |||||
| return sld; | |||||
| } | |||||
| BLI_assert(!"Should never happen, at least one EdgeSlideData should be valid"); | |||||
| return NULL; | |||||
| } | |||||
| static void calcEdgeSlideCustomPoints(struct TransInfo *t) | static void calcEdgeSlideCustomPoints(struct TransInfo *t) | ||||
| { | { | ||||
| EdgeSlideData *sld = TRANS_DATA_CONTAINER_FIRST_OK(t)->custom.mode.data; | EdgeSlideData *sld = edgeSlideFirstGet(t); | ||||
| setCustomPoints(t, &t->mouse, sld->mval_end, sld->mval_start); | setCustomPoints(t, &t->mouse, sld->mval_end, sld->mval_start); | ||||
| /* setCustomPoints isn't normally changing as the mouse moves, | /* setCustomPoints isn't normally changing as the mouse moves, | ||||
| * in this case apply mouse input immediately so we don't refresh | * in this case apply mouse input immediately so we don't refresh | ||||
| * with the value from the previous points */ | * with the value from the previous points */ | ||||
| applyMouseInput(t, &t->mouse, t->mval, t->values); | applyMouseInput(t, &t->mouse, t->mval, t->values); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 957 Lines • ▼ Show 20 Lines | static bool createEdgeSlideVerts_single_side(TransInfo *t, TransDataContainer *tc) | ||||
| return true; | return true; | ||||
| } | } | ||||
| void projectEdgeSlideData(TransInfo *t, bool is_final) | void projectEdgeSlideData(TransInfo *t, bool is_final) | ||||
| { | { | ||||
| FOREACH_TRANS_DATA_CONTAINER (t, tc) { | FOREACH_TRANS_DATA_CONTAINER (t, tc) { | ||||
| EdgeSlideData *sld = tc->custom.mode.data; | EdgeSlideData *sld = tc->custom.mode.data; | ||||
| SlideOrigData *sod = &sld->orig_data; | |||||
| if (sld == NULL) { | |||||
| continue; | |||||
| } | |||||
| SlideOrigData *sod = &sld->orig_data; | |||||
| if (sod->use_origfaces == false) { | if (sod->use_origfaces == false) { | ||||
| return; | return; | ||||
| } | } | ||||
| slide_origdata_interp_data(tc->obedit, | slide_origdata_interp_data(tc->obedit, | ||||
| sod, | sod, | ||||
| (TransDataGenericSlideVert *)sld->sv, | (TransDataGenericSlideVert *)sld->sv, | ||||
| sizeof(*sld->sv), | sizeof(*sld->sv), | ||||
| sld->totsv, | sld->totsv, | ||||
| is_final); | is_final); | ||||
| } | } | ||||
| } | } | ||||
| void freeEdgeSlideTempFaces(EdgeSlideData *sld) | void freeEdgeSlideTempFaces(EdgeSlideData *sld) | ||||
| { | { | ||||
| slide_origdata_free_date(&sld->orig_data); | slide_origdata_free_date(&sld->orig_data); | ||||
| } | } | ||||
| void freeEdgeSlideVerts(TransInfo *UNUSED(t), | void freeEdgeSlideVerts(TransInfo *UNUSED(t), | ||||
| TransDataContainer *UNUSED(tc), | TransDataContainer *UNUSED(tc), | ||||
| TransCustomData *custom_data) | TransCustomData *custom_data) | ||||
| { | { | ||||
| EdgeSlideData *sld = custom_data->data; | EdgeSlideData *sld = custom_data->data; | ||||
| if (!sld) { | if (sld == NULL) { | ||||
| return; | return; | ||||
| } | } | ||||
| freeEdgeSlideTempFaces(sld); | freeEdgeSlideTempFaces(sld); | ||||
| bmesh_edit_end(sld->em->bm, BMO_OPTYPE_FLAG_UNTAN_MULTIRES); | bmesh_edit_end(sld->em->bm, BMO_OPTYPE_FLAG_UNTAN_MULTIRES); | ||||
| MEM_freeN(sld->sv); | MEM_freeN(sld->sv); | ||||
| ▲ Show 20 Lines • Show All 125 Lines • ▼ Show 20 Lines | #endif | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| return TREDRAW_NOTHING; | return TREDRAW_NOTHING; | ||||
| } | } | ||||
| static void drawEdgeSlide(TransInfo *t) | static void drawEdgeSlide(TransInfo *t) | ||||
| { | { | ||||
| if ((t->mode == TFM_EDGE_SLIDE) && TRANS_DATA_CONTAINER_FIRST_OK(t)->custom.mode.data) { | if ((t->mode == TFM_EDGE_SLIDE) && edgeSlideFirstGet(t)) { | ||||
| const EdgeSlideParams *slp = t->custom.mode.data; | const EdgeSlideParams *slp = t->custom.mode.data; | ||||
| EdgeSlideData *sld = TRANS_DATA_CONTAINER_FIRST_OK(t)->custom.mode.data; | EdgeSlideData *sld = edgeSlideFirstGet(t); | ||||
| const bool is_clamp = !(t->flag & T_ALT_TRANSFORM); | const bool is_clamp = !(t->flag & T_ALT_TRANSFORM); | ||||
| /* Even mode */ | /* Even mode */ | ||||
| if ((slp->use_even == true) || (is_clamp == false)) { | if ((slp->use_even == true) || (is_clamp == false)) { | ||||
| const float line_size = UI_GetThemeValuef(TH_OUTLINE_WIDTH) + 0.5f; | const float line_size = UI_GetThemeValuef(TH_OUTLINE_WIDTH) + 0.5f; | ||||
| GPU_depth_test(false); | GPU_depth_test(false); | ||||
| ▲ Show 20 Lines • Show All 102 Lines • ▼ Show 20 Lines | if ((slp->use_even == true) || (is_clamp == false)) { | ||||
| GPU_depth_test(true); | GPU_depth_test(true); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| static void doEdgeSlide(TransInfo *t, float perc) | static void doEdgeSlide(TransInfo *t, float perc) | ||||
| { | { | ||||
| EdgeSlideParams *slp = t->custom.mode.data; | EdgeSlideParams *slp = t->custom.mode.data; | ||||
| EdgeSlideData *sld_active = TRANS_DATA_CONTAINER_FIRST_OK(t)->custom.mode.data; | EdgeSlideData *sld_active = edgeSlideFirstGet(t); | ||||
| slp->perc = perc; | slp->perc = perc; | ||||
| if (slp->use_even == false) { | if (slp->use_even == false) { | ||||
| const bool is_clamp = !(t->flag & T_ALT_TRANSFORM); | const bool is_clamp = !(t->flag & T_ALT_TRANSFORM); | ||||
| if (is_clamp) { | if (is_clamp) { | ||||
| const int side_index = (perc < 0.0f); | const int side_index = (perc < 0.0f); | ||||
| const float perc_final = fabsf(perc); | const float perc_final = fabsf(perc); | ||||
| FOREACH_TRANS_DATA_CONTAINER (t, tc) { | FOREACH_TRANS_DATA_CONTAINER (t, tc) { | ||||
| EdgeSlideData *sld = tc->custom.mode.data; | EdgeSlideData *sld = tc->custom.mode.data; | ||||
| if (sld == NULL) { | |||||
| continue; | |||||
| } | |||||
| TransDataEdgeSlideVert *sv = sld->sv; | TransDataEdgeSlideVert *sv = sld->sv; | ||||
| for (int i = 0; i < sld->totsv; i++, 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); | madd_v3_v3v3fl(sv->v->co, sv->v_co_orig, sv->dir_side[side_index], perc_final); | ||||
| } | } | ||||
| sld->curr_side_unclamp = side_index; | sld->curr_side_unclamp = side_index; | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| const float perc_init = fabsf(perc) * | const float perc_init = fabsf(perc) * | ||||
| ((sld_active->curr_side_unclamp == (perc < 0.0f)) ? 1 : -1); | ((sld_active->curr_side_unclamp == (perc < 0.0f)) ? 1 : -1); | ||||
| const int side_index = sld_active->curr_side_unclamp; | const int side_index = sld_active->curr_side_unclamp; | ||||
| FOREACH_TRANS_DATA_CONTAINER (t, tc) { | FOREACH_TRANS_DATA_CONTAINER (t, tc) { | ||||
| EdgeSlideData *sld = tc->custom.mode.data; | EdgeSlideData *sld = tc->custom.mode.data; | ||||
| if (sld == NULL) { | |||||
| continue; | |||||
| } | |||||
| TransDataEdgeSlideVert *sv = sld->sv; | TransDataEdgeSlideVert *sv = sld->sv; | ||||
| for (int i = 0; i < sld->totsv; i++, sv++) { | for (int i = 0; i < sld->totsv; i++, sv++) { | ||||
| float dir_flip[3]; | float dir_flip[3]; | ||||
| float perc_final = perc_init; | float perc_final = perc_init; | ||||
| if (!is_zero_v3(sv->dir_side[side_index])) { | if (!is_zero_v3(sv->dir_side[side_index])) { | ||||
| copy_v3_v3(dir_flip, sv->dir_side[side_index]); | copy_v3_v3(dir_flip, sv->dir_side[side_index]); | ||||
| } | } | ||||
| else { | else { | ||||
| Show All 20 Lines | else { | ||||
| const float curr_length_perc = curr_sv->edge_len * | const float curr_length_perc = curr_sv->edge_len * | ||||
| (((slp->flipped ? perc : -perc) + 1.0f) / 2.0f); | (((slp->flipped ? perc : -perc) + 1.0f) / 2.0f); | ||||
| float co_a[3]; | float co_a[3]; | ||||
| float co_b[3]; | float co_b[3]; | ||||
| FOREACH_TRANS_DATA_CONTAINER (t, tc) { | FOREACH_TRANS_DATA_CONTAINER (t, tc) { | ||||
| EdgeSlideData *sld = tc->custom.mode.data; | EdgeSlideData *sld = tc->custom.mode.data; | ||||
| if (sld == NULL) { | |||||
| continue; | |||||
| } | |||||
| TransDataEdgeSlideVert *sv = sld->sv; | TransDataEdgeSlideVert *sv = sld->sv; | ||||
| for (int i = 0; i < sld->totsv; i++, sv++) { | for (int i = 0; i < sld->totsv; i++, sv++) { | ||||
| if (sv->edge_len > FLT_EPSILON) { | if (sv->edge_len > FLT_EPSILON) { | ||||
| const float fac = min_ff(sv->edge_len, curr_length_perc) / sv->edge_len; | 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_a, sv->v_co_orig, sv->dir_side[0]); | ||||
| add_v3_v3v3(co_b, sv->v_co_orig, sv->dir_side[1]); | add_v3_v3v3(co_b, sv->v_co_orig, sv->dir_side[1]); | ||||
| ▲ Show 20 Lines • Show All 1,745 Lines • Show Last 20 Lines | |||||