Fix T100633: Node Editor: Edge scrolling breaks node snapping

The view offset, calculated by the Edge Pan system, only affects the
position of the nodes, but forget to update:
- snapping data
- final value of transform
- values used for custom drawing

Therefore, to avoid having to update a lot of scattered data, the
`transformViewUpdate` utility has been implemented to recalculate input
values when the view changes.

This utility does more than is necessary to fix the bug, but with that,
it can work in any situation.
This commit is contained in:
2022-08-26 13:17:30 -03:00
parent cc9c4e2744
commit 3c060b2216
7 changed files with 262 additions and 84 deletions

View File

@@ -8,6 +8,7 @@
#include <stdlib.h>
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "BKE_context.h"
@@ -18,6 +19,7 @@
#include "WM_types.h"
#include "transform.h"
#include "transform_mode.h"
#include "MEM_guardedalloc.h"
@@ -251,11 +253,8 @@ void setCustomPointsFromDirection(TransInfo *t, MouseInput *mi, const float dir[
/** \name Setup & Handle Mouse Input
* \{ */
void initMouseInput(TransInfo *UNUSED(t),
MouseInput *mi,
const float center[2],
const int mval[2],
const bool precision)
void initMouseInput(
TransInfo *t, MouseInput *mi, const float center[2], const int mval[2], const bool precision)
{
mi->factor = 0;
mi->precision = precision;
@@ -266,6 +265,12 @@ void initMouseInput(TransInfo *UNUSED(t),
mi->imval[0] = mval[0];
mi->imval[1] = mval[1];
if ((t->spacetype == SPACE_VIEW3D) && (t->region->regiontype == RGN_TYPE_WINDOW)) {
float delta[3] = {mval[0] - center[0], mval[1] - center[1]};
ED_view3d_win_to_delta(t->region, delta, t->zfac, delta);
add_v3_v3v3(mi->imval_unproj, t->center_global, delta);
}
mi->post = NULL;
}
@@ -441,4 +446,52 @@ void applyMouseInput(TransInfo *t, MouseInput *mi, const int mval[2], float outp
}
}
void transform_input_update(TransInfo *t, const float fac)
{
MouseInput *mi = &t->mouse;
t->mouse.factor *= fac;
if ((t->spacetype == SPACE_VIEW3D) && (t->region->regiontype == RGN_TYPE_WINDOW)) {
projectIntView(t, mi->imval_unproj, mi->imval);
}
else {
int offset[2], center_2d_int[2] = {mi->center[0], mi->center[1]};
sub_v2_v2v2_int(offset, mi->imval, center_2d_int);
offset[0] *= fac;
offset[1] *= fac;
center_2d_int[0] = t->center2d[0];
center_2d_int[1] = t->center2d[1];
add_v2_v2v2_int(mi->imval, center_2d_int, offset);
}
float center_old[2];
copy_v2_v2(center_old, mi->center);
copy_v2_v2(mi->center, t->center2d);
if (mi->use_virtual_mval) {
/* Update accumulator. */
double mval_delta[2];
sub_v2_v2v2_db(mval_delta, mi->virtual_mval.accum, mi->virtual_mval.prev);
mval_delta[0] *= fac;
mval_delta[1] *= fac;
copy_v2_v2_db(mi->virtual_mval.accum, mi->virtual_mval.prev);
add_v2_v2_db(mi->virtual_mval.accum, mval_delta);
}
if (ELEM(mi->apply, InputAngle, InputAngleSpring)) {
float offset_center[2];
sub_v2_v2v2(offset_center, mi->center, center_old);
struct InputAngle_Data *data = mi->data;
data->mval_prev[0] += offset_center[0];
data->mval_prev[1] += offset_center[1];
}
if (t->mode == TFM_EDGE_SLIDE) {
transform_mode_edge_slide_reproject_input(t);
}
else if (t->mode == TFM_VERT_SLIDE) {
transform_mode_vert_slide_reproject_input(t);
}
}
/** \} */