Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGermano Cavalcante <germano.costa@ig.com.br>2020-06-08 00:48:33 +0300
committerGermano Cavalcante <germano.costa@ig.com.br>2020-06-08 14:23:37 +0300
commite54fb1b8191ee41ce537c8e1d6bbf81fa5e0302d (patch)
treef09e64c3a7f94925f0729153e1eef707e5d8112d /source/blender/editors/transform/transform_generics.c
parent826769d1c7b5b56124b45512feb70d2e8607c0f5 (diff)
Cleanup: Move each recalcData to their respective TransData file
Diffstat (limited to 'source/blender/editors/transform/transform_generics.c')
-rw-r--r--source/blender/editors/transform/transform_generics.c1132
1 files changed, 0 insertions, 1132 deletions
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index 6de962a3ed1..beafbfab1ff 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -22,35 +22,15 @@
*/
#include <math.h>
-#include <string.h>
#include "MEM_guardedalloc.h"
-#include "BLI_sys_types.h" /* for intptr_t support */
-
-#include "DNA_anim_types.h"
-#include "DNA_armature_types.h"
-#include "DNA_brush_types.h"
-#include "DNA_constraint_types.h"
#include "DNA_gpencil_types.h"
-#include "DNA_lattice_types.h"
-#include "DNA_mask_types.h"
#include "DNA_mesh_types.h"
-#include "DNA_meta_types.h"
-#include "DNA_modifier_types.h"
-#include "DNA_movieclip_types.h"
-#include "DNA_object_types.h"
-#include "DNA_scene_types.h"
-#include "DNA_screen_types.h"
-#include "DNA_sequence_types.h"
-#include "DNA_space_types.h"
-#include "DNA_view3d_types.h"
#include "BLI_blenlib.h"
-#include "BLI_ghash.h"
#include "BLI_math.h"
#include "BLI_rand.h"
-#include "BLI_utildefines.h"
#include "PIL_time.h"
@@ -61,58 +41,25 @@
#include "GPU_immediate.h"
#include "GPU_matrix.h"
-#include "BIK_api.h"
-
-#include "BKE_action.h"
-#include "BKE_anim_data.h"
-#include "BKE_armature.h"
#include "BKE_context.h"
-#include "BKE_curve.h"
-#include "BKE_editmesh.h"
-#include "BKE_fcurve.h"
-#include "BKE_gpencil_geom.h"
-#include "BKE_lattice.h"
#include "BKE_layer.h"
-#include "BKE_lib_id.h"
#include "BKE_mask.h"
-#include "BKE_nla.h"
#include "BKE_paint.h"
-#include "BKE_scene.h"
-#include "BKE_sequencer.h"
-#include "BKE_tracking.h"
-#include "BKE_workspace.h"
-
-#include "DEG_depsgraph.h"
-#include "DEG_depsgraph_query.h"
-#include "ED_anim_api.h"
-#include "ED_armature.h"
#include "ED_clip.h"
-#include "ED_curve.h" /* for curve_editnurbs */
-#include "ED_gpencil.h"
#include "ED_image.h"
-#include "ED_keyframing.h"
-#include "ED_markers.h"
-#include "ED_mesh.h"
#include "ED_object.h"
-#include "ED_particle.h"
#include "ED_screen.h"
-#include "ED_screen_types.h"
-#include "ED_sculpt.h"
#include "ED_space_api.h"
#include "ED_uvedit.h"
-#include "ED_view3d.h"
#include "WM_api.h"
#include "WM_types.h"
-#include "RE_engine.h"
-
#include "UI_resources.h"
#include "UI_view2d.h"
#include "transform.h"
-#include "transform_convert.h"
#include "transform_mode.h"
#include "transform_snap.h"
@@ -131,1085 +78,6 @@ void getViewVector(const TransInfo *t, const float coord[3], float vec[3])
/* ************************** GENERICS **************************** */
-static void clipMirrorModifier(TransInfo *t)
-{
- FOREACH_TRANS_DATA_CONTAINER (t, tc) {
- Object *ob = tc->obedit;
- ModifierData *md = ob->modifiers.first;
- float tolerance[3] = {0.0f, 0.0f, 0.0f};
- int axis = 0;
-
- for (; md; md = md->next) {
- if ((md->type == eModifierType_Mirror) && (md->mode & eModifierMode_Realtime)) {
- MirrorModifierData *mmd = (MirrorModifierData *)md;
-
- if (mmd->flag & MOD_MIR_CLIPPING) {
- axis = 0;
- if (mmd->flag & MOD_MIR_AXIS_X) {
- axis |= 1;
- tolerance[0] = mmd->tolerance;
- }
- if (mmd->flag & MOD_MIR_AXIS_Y) {
- axis |= 2;
- tolerance[1] = mmd->tolerance;
- }
- if (mmd->flag & MOD_MIR_AXIS_Z) {
- axis |= 4;
- tolerance[2] = mmd->tolerance;
- }
- if (axis) {
- float mtx[4][4], imtx[4][4];
- int i;
-
- if (mmd->mirror_ob) {
- float obinv[4][4];
-
- invert_m4_m4(obinv, mmd->mirror_ob->obmat);
- mul_m4_m4m4(mtx, obinv, ob->obmat);
- invert_m4_m4(imtx, mtx);
- }
-
- TransData *td = tc->data;
- for (i = 0; i < tc->data_len; i++, td++) {
- int clip;
- float loc[3], iloc[3];
-
- if (td->loc == NULL) {
- break;
- }
-
- if (td->flag & TD_SKIP) {
- continue;
- }
-
- copy_v3_v3(loc, td->loc);
- copy_v3_v3(iloc, td->iloc);
-
- if (mmd->mirror_ob) {
- mul_m4_v3(mtx, loc);
- mul_m4_v3(mtx, iloc);
- }
-
- clip = 0;
- if (axis & 1) {
- if (fabsf(iloc[0]) <= tolerance[0] || loc[0] * iloc[0] < 0.0f) {
- loc[0] = 0.0f;
- clip = 1;
- }
- }
-
- if (axis & 2) {
- if (fabsf(iloc[1]) <= tolerance[1] || loc[1] * iloc[1] < 0.0f) {
- loc[1] = 0.0f;
- clip = 1;
- }
- }
- if (axis & 4) {
- if (fabsf(iloc[2]) <= tolerance[2] || loc[2] * iloc[2] < 0.0f) {
- loc[2] = 0.0f;
- clip = 1;
- }
- }
- if (clip) {
- if (mmd->mirror_ob) {
- mul_m4_v3(imtx, loc);
- }
- copy_v3_v3(td->loc, loc);
- }
- }
- }
- }
- }
- }
- }
-}
-
-/* assumes obedit set to mesh object */
-static void transform_apply_to_mirror(TransInfo *t)
-{
- FOREACH_TRANS_DATA_CONTAINER (t, tc) {
- if (tc->mirror.use_mirror_any) {
- int i;
- TransData *td;
- for (i = 0, td = tc->data; i < tc->data_len; i++, td++) {
- if (td->flag & (TD_MIRROR_EDGE_X | TD_MIRROR_EDGE_Y | TD_MIRROR_EDGE_Z)) {
- if (td->flag & TD_MIRROR_EDGE_X) {
- td->loc[0] = 0.0f;
- }
- if (td->flag & TD_MIRROR_EDGE_Y) {
- td->loc[1] = 0.0f;
- }
- if (td->flag & TD_MIRROR_EDGE_Z) {
- td->loc[2] = 0.0f;
- }
- }
- }
-
- TransDataMirror *tdm;
- for (i = 0, tdm = tc->mirror.data; i < tc->mirror.data_len; i++, tdm++) {
- tdm->loc_dst[0] = tdm->loc_src[0] * tdm->sign_x;
- tdm->loc_dst[1] = tdm->loc_src[1] * tdm->sign_y;
- tdm->loc_dst[2] = tdm->loc_src[2] * tdm->sign_z;
- }
- }
- }
-}
-
-/* for the realtime animation recording feature, handle overlapping data */
-static void animrecord_check_state(Scene *scene, ID *id, wmTimer *animtimer)
-{
- ScreenAnimData *sad = (animtimer) ? animtimer->customdata : NULL;
-
- /* sanity checks */
- if (ELEM(NULL, scene, id, sad)) {
- return;
- }
-
- /* check if we need a new strip if:
- * - if animtimer is running
- * - we're not only keying for available channels
- * - the option to add new actions for each round is not enabled
- */
- if (IS_AUTOKEY_FLAG(scene, INSERTAVAIL) == 0 &&
- (scene->toolsettings->autokey_flag & ANIMRECORD_FLAG_WITHNLA)) {
- /* if playback has just looped around,
- * we need to add a new NLA track+strip to allow a clean pass to occur */
- if ((sad) && (sad->flag & ANIMPLAY_FLAG_JUMPED)) {
- AnimData *adt = BKE_animdata_from_id(id);
- const bool is_first = (adt) && (adt->nla_tracks.first == NULL);
-
- /* perform push-down manually with some differences
- * NOTE: BKE_nla_action_pushdown() sync warning...
- */
- if ((adt->action) && !(adt->flag & ADT_NLA_EDIT_ON)) {
- float astart, aend;
-
- /* only push down if action is more than 1-2 frames long */
- calc_action_range(adt->action, &astart, &aend, 1);
- if (aend > astart + 2.0f) {
- NlaStrip *strip = BKE_nlastack_add_strip(adt, adt->action);
-
- /* clear reference to action now that we've pushed it onto the stack */
- id_us_min(&adt->action->id);
- adt->action = NULL;
-
- /* adjust blending + extend so that they will behave correctly */
- strip->extendmode = NLASTRIP_EXTEND_NOTHING;
- strip->flag &= ~(NLASTRIP_FLAG_AUTO_BLENDS | NLASTRIP_FLAG_SELECT |
- NLASTRIP_FLAG_ACTIVE);
-
- /* copy current "action blending" settings from adt to the strip,
- * as it was keyframed with these settings, so omitting them will
- * change the effect [T54766]
- */
- if (is_first == false) {
- strip->blendmode = adt->act_blendmode;
- strip->influence = adt->act_influence;
-
- if (adt->act_influence < 1.0f) {
- /* enable "user-controlled" influence (which will insert a default keyframe)
- * so that the influence doesn't get lost on the new update
- *
- * NOTE: An alternative way would have been to instead hack the influence
- * to not get always get reset to full strength if NLASTRIP_FLAG_USR_INFLUENCE
- * is disabled but auto-blending isn't being used. However, that approach
- * is a bit hacky/hard to discover, and may cause backwards compatibility issues,
- * so it's better to just do it this way.
- */
- strip->flag |= NLASTRIP_FLAG_USR_INFLUENCE;
- BKE_nlastrip_validate_fcurves(strip);
- }
- }
-
- /* also, adjust the AnimData's action extend mode to be on
- * 'nothing' so that previous result still play
- */
- adt->act_extendmode = NLASTRIP_EXTEND_NOTHING;
- }
- }
- }
- }
-}
-
-static bool fcu_test_selected(FCurve *fcu)
-{
- BezTriple *bezt = fcu->bezt;
- uint i;
-
- if (bezt == NULL) { /* ignore baked */
- return 0;
- }
-
- for (i = 0; i < fcu->totvert; i++, bezt++) {
- if (BEZT_ISSEL_ANY(bezt)) {
- return 1;
- }
- }
-
- return 0;
-}
-
-/* helper for recalcData() - for Action Editor transforms */
-static void recalcData_actedit(TransInfo *t)
-{
- ViewLayer *view_layer = t->view_layer;
- SpaceAction *saction = (SpaceAction *)t->area->spacedata.first;
-
- bAnimContext ac = {NULL};
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
-
- /* initialize relevant anim-context 'context' data from TransInfo data */
- /* NOTE: sync this with the code in ANIM_animdata_get_context() */
- ac.bmain = CTX_data_main(t->context);
- ac.scene = t->scene;
- ac.view_layer = t->view_layer;
- ac.obact = OBACT(view_layer);
- ac.area = t->area;
- ac.region = t->region;
- ac.sl = (t->area) ? t->area->spacedata.first : NULL;
- ac.spacetype = (t->area) ? t->area->spacetype : 0;
- ac.regiontype = (t->region) ? t->region->regiontype : 0;
-
- ANIM_animdata_context_getdata(&ac);
-
- /* perform flush */
- if (ELEM(ac.datatype, ANIMCONT_GPENCIL, ANIMCONT_MASK)) {
- /* flush transform values back to actual coordinates */
- flushTransIntFrameActionData(t);
- }
-
- if (ac.datatype != ANIMCONT_MASK) {
- /* Get animdata blocks visible in editor,
- * assuming that these will be the ones where things changed. */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_ANIMDATA);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
- /* just tag these animdata-blocks to recalc, assuming that some data there changed
- * BUT only do this if realtime updates are enabled
- */
- if ((saction->flag & SACTION_NOREALTIMEUPDATES) == 0) {
- for (ale = anim_data.first; ale; ale = ale->next) {
- /* set refresh tags for objects using this animation */
- ANIM_list_elem_update(CTX_data_main(t->context), t->scene, ale);
- }
- }
-
- /* now free temp channels */
- ANIM_animdata_freelist(&anim_data);
- }
-}
-/* helper for recalcData() - for Graph Editor transforms */
-static void recalcData_graphedit(TransInfo *t)
-{
- SpaceGraph *sipo = (SpaceGraph *)t->area->spacedata.first;
- ViewLayer *view_layer = t->view_layer;
-
- ListBase anim_data = {NULL, NULL};
- bAnimContext ac = {NULL};
- int filter;
-
- bAnimListElem *ale;
- int dosort = 0;
-
- /* initialize relevant anim-context 'context' data from TransInfo data */
- /* NOTE: sync this with the code in ANIM_animdata_get_context() */
- ac.bmain = CTX_data_main(t->context);
- ac.scene = t->scene;
- ac.view_layer = t->view_layer;
- ac.obact = OBACT(view_layer);
- ac.area = t->area;
- ac.region = t->region;
- ac.sl = (t->area) ? t->area->spacedata.first : NULL;
- ac.spacetype = (t->area) ? t->area->spacetype : 0;
- ac.regiontype = (t->region) ? t->region->regiontype : 0;
-
- ANIM_animdata_context_getdata(&ac);
-
- /* do the flush first */
- flushTransGraphData(t);
-
- /* get curves to check if a re-sort is needed */
- filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVE_VISIBLE);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
- /* now test if there is a need to re-sort */
- for (ale = anim_data.first; ale; ale = ale->next) {
- FCurve *fcu = (FCurve *)ale->key_data;
-
- /* ignore FC-Curves without any selected verts */
- if (!fcu_test_selected(fcu)) {
- continue;
- }
-
- /* watch it: if the time is wrong: do not correct handles yet */
- if (test_time_fcurve(fcu)) {
- dosort++;
- }
- else {
- calchandles_fcurve_ex(fcu, BEZT_FLAG_TEMP_TAG);
- }
-
- /* set refresh tags for objects using this animation,
- * BUT only if realtime updates are enabled
- */
- if ((sipo->flag & SIPO_NOREALTIMEUPDATES) == 0) {
- ANIM_list_elem_update(CTX_data_main(t->context), t->scene, ale);
- }
- }
-
- /* do resort and other updates? */
- if (dosort) {
- remake_graph_transdata(t, &anim_data);
- }
-
- /* now free temp channels */
- ANIM_animdata_freelist(&anim_data);
-}
-
-/* helper for recalcData() - for NLA Editor transforms */
-static void recalcData_nla(TransInfo *t)
-{
- SpaceNla *snla = (SpaceNla *)t->area->spacedata.first;
- Scene *scene = t->scene;
- double secf = FPS;
- int i;
-
- TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t);
- TransDataNla *tdn = tc->custom.type.data;
-
- /* For each strip we've got, perform some additional validation of the values
- * that got set before using RNA to set the value (which does some special
- * operations when setting these values to make sure that everything works ok).
- */
- for (i = 0; i < tc->data_len; i++, tdn++) {
- NlaStrip *strip = tdn->strip;
- PointerRNA strip_ptr;
- short pExceeded, nExceeded, iter;
- int delta_y1, delta_y2;
-
- /* if this tdn has no handles, that means it is just a dummy that should be skipped */
- if (tdn->handle == 0) {
- continue;
- }
-
- /* set refresh tags for objects using this animation,
- * BUT only if realtime updates are enabled
- */
- if ((snla->flag & SNLA_NOREALTIMEUPDATES) == 0) {
- ANIM_id_update(CTX_data_main(t->context), tdn->id);
- }
-
- /* if canceling transform, just write the values without validating, then move on */
- if (t->state == TRANS_CANCEL) {
- /* clear the values by directly overwriting the originals, but also need to restore
- * endpoints of neighboring transition-strips
- */
-
- /* start */
- strip->start = tdn->h1[0];
-
- if ((strip->prev) && (strip->prev->type == NLASTRIP_TYPE_TRANSITION)) {
- strip->prev->end = tdn->h1[0];
- }
-
- /* end */
- strip->end = tdn->h2[0];
-
- if ((strip->next) && (strip->next->type == NLASTRIP_TYPE_TRANSITION)) {
- strip->next->start = tdn->h2[0];
- }
-
- /* flush transforms to child strips (since this should be a meta) */
- BKE_nlameta_flush_transforms(strip);
-
- /* restore to original track (if needed) */
- if (tdn->oldTrack != tdn->nlt) {
- /* Just append to end of list for now,
- * since strips get sorted in special_aftertrans_update(). */
- BLI_remlink(&tdn->nlt->strips, strip);
- BLI_addtail(&tdn->oldTrack->strips, strip);
- }
-
- continue;
- }
-
- /* firstly, check if the proposed transform locations would overlap with any neighboring strips
- * (barring transitions) which are absolute barriers since they are not being moved
- *
- * this is done as a iterative procedure (done 5 times max for now)
- */
- for (iter = 0; iter < 5; iter++) {
- pExceeded = ((strip->prev) && (strip->prev->type != NLASTRIP_TYPE_TRANSITION) &&
- (tdn->h1[0] < strip->prev->end));
- nExceeded = ((strip->next) && (strip->next->type != NLASTRIP_TYPE_TRANSITION) &&
- (tdn->h2[0] > strip->next->start));
-
- if ((pExceeded && nExceeded) || (iter == 4)) {
- /* both endpoints exceeded (or iteration ping-pong'd meaning that we need a compromise)
- * - Simply crop strip to fit within the bounds of the strips bounding it
- * - If there were no neighbors, clear the transforms
- * (make it default to the strip's current values).
- */
- if (strip->prev && strip->next) {
- tdn->h1[0] = strip->prev->end;
- tdn->h2[0] = strip->next->start;
- }
- else {
- tdn->h1[0] = strip->start;
- tdn->h2[0] = strip->end;
- }
- }
- else if (nExceeded) {
- /* move backwards */
- float offset = tdn->h2[0] - strip->next->start;
-
- tdn->h1[0] -= offset;
- tdn->h2[0] -= offset;
- }
- else if (pExceeded) {
- /* more forwards */
- float offset = strip->prev->end - tdn->h1[0];
-
- tdn->h1[0] += offset;
- tdn->h2[0] += offset;
- }
- else { /* all is fine and well */
- break;
- }
- }
-
- /* handle auto-snapping
- * NOTE: only do this when transform is still running, or we can't restore
- */
- if (t->state != TRANS_CANCEL) {
- switch (snla->autosnap) {
- case SACTSNAP_FRAME: /* snap to nearest frame */
- case SACTSNAP_STEP: /* frame step - this is basically the same,
- * since we don't have any remapping going on */
- {
- tdn->h1[0] = floorf(tdn->h1[0] + 0.5f);
- tdn->h2[0] = floorf(tdn->h2[0] + 0.5f);
- break;
- }
-
- case SACTSNAP_SECOND: /* snap to nearest second */
- case SACTSNAP_TSTEP: /* second step - this is basically the same,
- * since we don't have any remapping going on */
- {
- /* This case behaves differently from the rest, since lengths of strips
- * may not be multiples of a second. If we just naively resize adjust
- * the handles, things may not work correctly. Instead, we only snap
- * the first handle, and move the other to fit.
- *
- * FIXME: we do run into problems here when user attempts to negatively
- * scale the strip, as it then just compresses down and refuses
- * to expand out the other end.
- */
- float h1_new = (float)(floor(((double)tdn->h1[0] / secf) + 0.5) * secf);
- float delta = h1_new - tdn->h1[0];
-
- tdn->h1[0] = h1_new;
- tdn->h2[0] += delta;
- break;
- }
-
- case SACTSNAP_MARKER: /* snap to nearest marker */
- {
- tdn->h1[0] = (float)ED_markers_find_nearest_marker_time(&t->scene->markers, tdn->h1[0]);
- tdn->h2[0] = (float)ED_markers_find_nearest_marker_time(&t->scene->markers, tdn->h2[0]);
- break;
- }
- }
- }
-
- /* Use RNA to write the values to ensure that constraints on these are obeyed
- * (e.g. for transition strips, the values are taken from the neighbors)
- *
- * NOTE: we write these twice to avoid truncation errors which can arise when
- * moving the strips a large distance using numeric input [#33852]
- */
- RNA_pointer_create(NULL, &RNA_NlaStrip, strip, &strip_ptr);
-
- RNA_float_set(&strip_ptr, "frame_start", tdn->h1[0]);
- RNA_float_set(&strip_ptr, "frame_end", tdn->h2[0]);
-
- RNA_float_set(&strip_ptr, "frame_start", tdn->h1[0]);
- RNA_float_set(&strip_ptr, "frame_end", tdn->h2[0]);
-
- /* flush transforms to child strips (since this should be a meta) */
- BKE_nlameta_flush_transforms(strip);
-
- /* Now, check if we need to try and move track:
- * - we need to calculate both,
- * as only one may have been altered by transform if only 1 handle moved.
- */
- delta_y1 = ((int)tdn->h1[1] / NLACHANNEL_STEP(snla) - tdn->trackIndex);
- delta_y2 = ((int)tdn->h2[1] / NLACHANNEL_STEP(snla) - tdn->trackIndex);
-
- if (delta_y1 || delta_y2) {
- NlaTrack *track;
- int delta = (delta_y2) ? delta_y2 : delta_y1;
- int n;
-
- /* Move in the requested direction,
- * checking at each layer if there's space for strip to pass through,
- * stopping on the last track available or that we're able to fit in.
- */
- if (delta > 0) {
- for (track = tdn->nlt->next, n = 0; (track) && (n < delta); track = track->next, n++) {
- /* check if space in this track for the strip */
- if (BKE_nlatrack_has_space(track, strip->start, strip->end)) {
- /* move strip to this track */
- BLI_remlink(&tdn->nlt->strips, strip);
- BKE_nlatrack_add_strip(track, strip);
-
- tdn->nlt = track;
- tdn->trackIndex++;
- }
- else { /* can't move any further */
- break;
- }
- }
- }
- else {
- /* make delta 'positive' before using it, since we now know to go backwards */
- delta = -delta;
-
- for (track = tdn->nlt->prev, n = 0; (track) && (n < delta); track = track->prev, n++) {
- /* check if space in this track for the strip */
- if (BKE_nlatrack_has_space(track, strip->start, strip->end)) {
- /* move strip to this track */
- BLI_remlink(&tdn->nlt->strips, strip);
- BKE_nlatrack_add_strip(track, strip);
-
- tdn->nlt = track;
- tdn->trackIndex--;
- }
- else { /* can't move any further */
- break;
- }
- }
- }
- }
- }
-}
-
-static void recalcData_mask_common(TransInfo *t)
-{
- Mask *mask = CTX_data_edit_mask(t->context);
-
- flushTransMasking(t);
-
- DEG_id_tag_update(&mask->id, 0);
-}
-
-/* helper for recalcData() - for Image Editor transforms */
-static void recalcData_image(TransInfo *t)
-{
- if (t->options & CTX_MASK) {
- recalcData_mask_common(t);
- }
- else if (t->options & CTX_PAINT_CURVE) {
- flushTransPaintCurve(t);
- }
- else if ((t->flag & T_EDIT) && t->obedit_type == OB_MESH) {
- SpaceImage *sima = t->area->spacedata.first;
-
- flushTransUVs(t);
- if (sima->flag & SI_LIVE_UNWRAP) {
- ED_uvedit_live_unwrap_re_solve();
- }
-
- FOREACH_TRANS_DATA_CONTAINER (t, tc) {
- if (tc->data_len) {
- DEG_id_tag_update(tc->obedit->data, 0);
- }
- }
- }
-}
-
-/* helper for recalcData() - for Movie Clip transforms */
-static void recalcData_spaceclip(TransInfo *t)
-{
- SpaceClip *sc = t->area->spacedata.first;
-
- if (ED_space_clip_check_show_trackedit(sc)) {
- MovieClip *clip = ED_space_clip_get_clip(sc);
- ListBase *tracksbase = BKE_tracking_get_active_tracks(&clip->tracking);
- MovieTrackingTrack *track;
- int framenr = ED_space_clip_get_clip_frame_number(sc);
-
- flushTransTracking(t);
-
- track = tracksbase->first;
- while (track) {
- if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_LOCKED) == 0) {
- MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
-
- if (t->mode == TFM_TRANSLATION) {
- if (TRACK_AREA_SELECTED(track, TRACK_AREA_PAT)) {
- BKE_tracking_marker_clamp(marker, CLAMP_PAT_POS);
- }
- if (TRACK_AREA_SELECTED(track, TRACK_AREA_SEARCH)) {
- BKE_tracking_marker_clamp(marker, CLAMP_SEARCH_POS);
- }
- }
- else if (t->mode == TFM_RESIZE) {
- if (TRACK_AREA_SELECTED(track, TRACK_AREA_PAT)) {
- BKE_tracking_marker_clamp(marker, CLAMP_PAT_DIM);
- }
- if (TRACK_AREA_SELECTED(track, TRACK_AREA_SEARCH)) {
- BKE_tracking_marker_clamp(marker, CLAMP_SEARCH_DIM);
- }
- }
- else if (t->mode == TFM_ROTATION) {
- if (TRACK_AREA_SELECTED(track, TRACK_AREA_PAT)) {
- BKE_tracking_marker_clamp(marker, CLAMP_PAT_POS);
- }
- }
- }
-
- track = track->next;
- }
-
- DEG_id_tag_update(&clip->id, 0);
- }
- else if (t->options & CTX_MASK) {
- recalcData_mask_common(t);
- }
-}
-
-/* helper for recalcData() - for object transforms, typically in the 3D view */
-static void recalcData_objects(TransInfo *t)
-{
- Base *base = t->view_layer->basact;
-
- if (t->obedit_type != -1) {
- if (ELEM(t->obedit_type, OB_CURVE, OB_SURF)) {
-
- if (t->state != TRANS_CANCEL) {
- clipMirrorModifier(t);
- applyProject(t);
- }
-
- FOREACH_TRANS_DATA_CONTAINER (t, tc) {
- Curve *cu = tc->obedit->data;
- ListBase *nurbs = BKE_curve_editNurbs_get(cu);
- Nurb *nu = nurbs->first;
-
- DEG_id_tag_update(tc->obedit->data, 0); /* sets recalc flags */
-
- if (t->state == TRANS_CANCEL) {
- while (nu) {
- /* Cant do testhandlesNurb here, it messes up the h1 and h2 flags */
- BKE_nurb_handles_calc(nu);
- nu = nu->next;
- }
- }
- else {
- /* Normal updating */
- while (nu) {
- BKE_nurb_test_2d(nu);
- BKE_nurb_handles_calc(nu);
- nu = nu->next;
- }
- }
- }
- }
- else if (t->obedit_type == OB_LATTICE) {
-
- if (t->state != TRANS_CANCEL) {
- applyProject(t);
- }
-
- FOREACH_TRANS_DATA_CONTAINER (t, tc) {
- Lattice *la = tc->obedit->data;
- DEG_id_tag_update(tc->obedit->data, 0); /* sets recalc flags */
- if (la->editlatt->latt->flag & LT_OUTSIDE) {
- outside_lattice(la->editlatt->latt);
- }
- }
- }
- else if (t->obedit_type == OB_MESH) {
- /* mirror modifier clipping? */
- if (t->state != TRANS_CANCEL) {
- /* apply clipping after so we never project past the clip plane [#25423] */
- applyProject(t);
- clipMirrorModifier(t);
- }
- if ((t->flag & T_NO_MIRROR) == 0 && (t->options & CTX_NO_MIRROR) == 0) {
- transform_apply_to_mirror(t);
- }
-
- if (t->mode == TFM_EDGE_SLIDE) {
- projectEdgeSlideData(t, false);
- }
- else if (t->mode == TFM_VERT_SLIDE) {
- projectVertSlideData(t, false);
- }
-
- FOREACH_TRANS_DATA_CONTAINER (t, tc) {
- DEG_id_tag_update(tc->obedit->data, 0); /* sets recalc flags */
- BMEditMesh *em = BKE_editmesh_from_object(tc->obedit);
- EDBM_mesh_normals_update(em);
- BKE_editmesh_looptri_calc(em);
- }
- }
- else if (t->obedit_type == OB_ARMATURE) { /* no recalc flag, does pose */
-
- if (t->state != TRANS_CANCEL) {
- applyProject(t);
- }
-
- FOREACH_TRANS_DATA_CONTAINER (t, tc) {
- bArmature *arm = tc->obedit->data;
- ListBase *edbo = arm->edbo;
- EditBone *ebo, *ebo_parent;
- TransData *td = tc->data;
- int i;
-
- /* Ensure all bones are correctly adjusted */
- for (ebo = edbo->first; ebo; ebo = ebo->next) {
- ebo_parent = (ebo->flag & BONE_CONNECTED) ? ebo->parent : NULL;
-
- if (ebo_parent) {
- /* If this bone has a parent tip that has been moved */
- if (ebo_parent->flag & BONE_TIPSEL) {
- copy_v3_v3(ebo->head, ebo_parent->tail);
- if (t->mode == TFM_BONE_ENVELOPE) {
- ebo->rad_head = ebo_parent->rad_tail;
- }
- }
- /* If this bone has a parent tip that has NOT been moved */
- else {
- copy_v3_v3(ebo_parent->tail, ebo->head);
- if (t->mode == TFM_BONE_ENVELOPE) {
- ebo_parent->rad_tail = ebo->rad_head;
- }
- }
- }
-
- /* on extrude bones, oldlength==0.0f, so we scale radius of points */
- ebo->length = len_v3v3(ebo->head, ebo->tail);
- if (ebo->oldlength == 0.0f) {
- ebo->rad_head = 0.25f * ebo->length;
- ebo->rad_tail = 0.10f * ebo->length;
- ebo->dist = 0.25f * ebo->length;
- if (ebo->parent) {
- if (ebo->rad_head > ebo->parent->rad_tail) {
- ebo->rad_head = ebo->parent->rad_tail;
- }
- }
- }
- else if (t->mode != TFM_BONE_ENVELOPE) {
- /* if bones change length, lets do that for the deform distance as well */
- ebo->dist *= ebo->length / ebo->oldlength;
- ebo->rad_head *= ebo->length / ebo->oldlength;
- ebo->rad_tail *= ebo->length / ebo->oldlength;
- ebo->oldlength = ebo->length;
-
- if (ebo_parent) {
- ebo_parent->rad_tail = ebo->rad_head;
- }
- }
- }
-
- if (!ELEM(
- t->mode, TFM_BONE_ROLL, TFM_BONE_ENVELOPE, TFM_BONE_ENVELOPE_DIST, TFM_BONESIZE)) {
- /* fix roll */
- for (i = 0; i < tc->data_len; i++, td++) {
- if (td->extra) {
- float vec[3], up_axis[3];
- float qrot[4];
- float roll;
-
- ebo = td->extra;
-
- if (t->state == TRANS_CANCEL) {
- /* restore roll */
- ebo->roll = td->ival;
- }
- else {
- copy_v3_v3(up_axis, td->axismtx[2]);
-
- sub_v3_v3v3(vec, ebo->tail, ebo->head);
- normalize_v3(vec);
- rotation_between_vecs_to_quat(qrot, td->axismtx[1], vec);
- mul_qt_v3(qrot, up_axis);
-
- /* roll has a tendency to flip in certain orientations - [#34283], [#33974] */
- roll = ED_armature_ebone_roll_to_vector(ebo, up_axis, false);
- ebo->roll = angle_compat_rad(roll, td->ival);
- }
- }
- }
- }
-
- if (arm->flag & ARM_MIRROR_EDIT) {
- if (t->state != TRANS_CANCEL) {
- ED_armature_edit_transform_mirror_update(tc->obedit);
- }
- else {
- restoreBones(tc);
- }
- }
-
- /* Tag for redraw/invalidate overlay cache. */
- DEG_id_tag_update(&arm->id, ID_RECALC_SELECT);
- }
- }
- else {
- if (t->state != TRANS_CANCEL) {
- applyProject(t);
- }
- FOREACH_TRANS_DATA_CONTAINER (t, tc) {
- if (tc->data_len) {
- DEG_id_tag_update(tc->obedit->data, 0); /* sets recalc flags */
- }
- }
- }
- }
- else if (t->flag & T_POSE && (t->mode == TFM_BONESIZE)) {
- /* Handle the exception where for TFM_BONESIZE in edit mode we pretend to be
- * in pose mode (to use bone orientation matrix),
- * in that case we have to do mirroring as well. */
- FOREACH_TRANS_DATA_CONTAINER (t, tc) {
- Object *ob = tc->poseobj;
- bArmature *arm = ob->data;
- if (ob->mode == OB_MODE_EDIT) {
- if (arm->flag & ARM_MIRROR_EDIT) {
- if (t->state != TRANS_CANCEL) {
- ED_armature_edit_transform_mirror_update(ob);
- }
- else {
- restoreBones(tc);
- }
- }
- }
- else if (ob->mode == OB_MODE_POSE) {
- /* actually support TFM_BONESIZE in posemode as well */
- DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
- bPose *pose = ob->pose;
- if (arm->flag & ARM_MIRROR_EDIT || pose->flag & POSE_MIRROR_EDIT) {
- pose_transform_mirror_update(t, tc, ob);
- }
- }
- }
- }
- else if (t->flag & T_POSE) {
- GSet *motionpath_updates = BLI_gset_ptr_new("motionpath updates");
-
- FOREACH_TRANS_DATA_CONTAINER (t, tc) {
- Object *ob = tc->poseobj;
- bPose *pose = ob->pose;
-
- if (pose->flag & POSE_MIRROR_EDIT) {
- if (t->state != TRANS_CANCEL) {
- pose_transform_mirror_update(t, tc, ob);
- }
- else {
- restoreMirrorPoseBones(tc);
- }
- }
-
- /* if animtimer is running, and the object already has animation data,
- * check if the auto-record feature means that we should record 'samples'
- * (i.e. un-editable animation values)
- *
- * context is needed for keying set poll() functions.
- */
-
- /* TODO: autokeyframe calls need some setting to specify to add samples
- * (FPoints) instead of keyframes? */
- if ((t->animtimer) && (t->context) && IS_AUTOKEY_ON(t->scene)) {
- int targetless_ik =
- (t->flag & T_AUTOIK); // XXX this currently doesn't work, since flags aren't set yet!
-
- animrecord_check_state(t->scene, &ob->id, t->animtimer);
- autokeyframe_pose(t->context, t->scene, ob, t->mode, targetless_ik);
- }
-
- if (motionpath_need_update_pose(t->scene, ob)) {
- BLI_gset_insert(motionpath_updates, ob);
- }
-
- DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
- }
-
- /* Update motion paths once for all transformed bones in an object. */
- GSetIterator gs_iter;
- GSET_ITER (gs_iter, motionpath_updates) {
- Object *ob = BLI_gsetIterator_getKey(&gs_iter);
- ED_pose_recalculate_paths(t->context, t->scene, ob, POSE_PATH_CALC_RANGE_CURRENT_FRAME);
- }
- BLI_gset_free(motionpath_updates, NULL);
- }
- else if (base && (base->object->mode & OB_MODE_PARTICLE_EDIT) &&
- PE_get_current(t->depsgraph, t->scene, base->object)) {
- if (t->state != TRANS_CANCEL) {
- applyProject(t);
- }
- flushTransParticles(t);
- }
- else {
- bool motionpath_update = false;
-
- if (t->state != TRANS_CANCEL) {
- applyProject(t);
- }
-
- FOREACH_TRANS_DATA_CONTAINER (t, tc) {
- TransData *td = tc->data;
-
- for (int i = 0; i < tc->data_len; i++, td++) {
- Object *ob = td->ob;
- if (td->flag & TD_SKIP) {
- continue;
- }
-
- /* if animtimer is running, and the object already has animation data,
- * check if the auto-record feature means that we should record 'samples'
- * (i.e. uneditable animation values)
- */
- /* TODO: autokeyframe calls need some setting to specify to add samples
- * (FPoints) instead of keyframes? */
- if ((t->animtimer) && IS_AUTOKEY_ON(t->scene)) {
- animrecord_check_state(t->scene, &ob->id, t->animtimer);
- autokeyframe_object(t->context, t->scene, t->view_layer, ob, t->mode);
- }
-
- motionpath_update |= motionpath_need_update_object(t->scene, ob);
-
- /* sets recalc flags fully, instead of flushing existing ones
- * otherwise proxies don't function correctly
- */
- DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM);
-
- if (t->flag & T_TEXTURE) {
- DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
- }
- }
- }
-
- if (motionpath_update) {
- /* Update motion paths once for all transformed objects. */
- ED_objects_recalculate_paths(t->context, t->scene, OBJECT_PATH_CALC_RANGE_CURRENT_FRAME);
- }
-
- if (t->options & CTX_OBMODE_XFORM_SKIP_CHILDREN) {
- trans_obchild_in_obmode_update_all(t);
- }
-
- if (t->options & CTX_OBMODE_XFORM_OBDATA) {
- trans_obdata_in_obmode_update_all(t);
- }
- }
-}
-
-static void recalcData_cursor(TransInfo *t)
-{
- DEG_id_tag_update(&t->scene->id, ID_RECALC_COPY_ON_WRITE);
-}
-
-/* helper for recalcData() - for sequencer transforms */
-static void recalcData_sequencer(TransInfo *t)
-{
- TransData *td;
- int a;
- Sequence *seq_prev = NULL;
-
- TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t);
-
- for (a = 0, td = tc->data; a < tc->data_len; a++, td++) {
- TransDataSeq *tdsq = (TransDataSeq *)td->extra;
- Sequence *seq = tdsq->seq;
-
- if (seq != seq_prev) {
- BKE_sequence_invalidate_cache_composite(t->scene, seq);
- }
-
- seq_prev = seq;
- }
-
- DEG_id_tag_update(&t->scene->id, ID_RECALC_SEQUENCER_STRIPS);
-
- flushTransSeq(t);
-}
-
-/* force recalculation of triangles during transformation */
-static void recalcData_gpencil_strokes(TransInfo *t)
-{
- TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t);
- GHash *strokes = BLI_ghash_ptr_new(__func__);
-
- TransData *td = tc->data;
- for (int i = 0; i < tc->data_len; i++, td++) {
- bGPDstroke *gps = td->extra;
-
- if ((gps != NULL) && (!BLI_ghash_haskey(strokes, gps))) {
- BLI_ghash_insert(strokes, gps, gps);
- /* Calc geometry data. */
- BKE_gpencil_stroke_geometry_update(gps);
- }
- }
- BLI_ghash_free(strokes, NULL, NULL);
-}
-
-static void recalcData_sculpt(TransInfo *t)
-{
- ED_sculpt_update_modal_transform(t->context);
-}
-
-/* called for updating while transform acts, once per redraw */
-void recalcData(TransInfo *t)
-{
- /* if tests must match createTransData for correct updates */
- if (t->options & CTX_CURSOR) {
- recalcData_cursor(t);
- }
- else if (t->options & CTX_TEXTURE) {
- recalcData_objects(t);
- }
- else if (t->options & CTX_EDGE) {
- recalcData_objects(t);
- }
- else if (t->options & CTX_PAINT_CURVE) {
- flushTransPaintCurve(t);
- }
- else if (t->options & CTX_GPENCIL_STROKES) {
- recalcData_gpencil_strokes(t);
- }
- else if (t->options & CTX_SCULPT) {
- recalcData_sculpt(t);
- }
- else if (t->spacetype == SPACE_IMAGE) {
- recalcData_image(t);
- }
- else if (t->spacetype == SPACE_ACTION) {
- recalcData_actedit(t);
- }
- else if (t->spacetype == SPACE_NLA) {
- recalcData_nla(t);
- }
- else if (t->spacetype == SPACE_SEQ) {
- recalcData_sequencer(t);
- }
- else if (t->spacetype == SPACE_GRAPH) {
- recalcData_graphedit(t);
- }
- else if (t->spacetype == SPACE_NODE) {
- flushTransNodes(t);
- }
- else if (t->spacetype == SPACE_CLIP) {
- recalcData_spaceclip(t);
- }
- else {
- recalcData_objects(t);
- }
-}
-
void drawLine(TransInfo *t, const float center[3], const float dir[3], char axis, short options)
{
float v1[3], v2[3], v3[3];