diff options
author | mano-wii <germano.costa@ig.com.br> | 2019-10-28 15:51:53 +0300 |
---|---|---|
committer | mano-wii <germano.costa@ig.com.br> | 2019-10-28 15:51:53 +0300 |
commit | ce0db668ec0410c8b2d41f605e2cf5e608df5082 (patch) | |
tree | 7269b7b71463e801193905c93da1eed60e112bda /source/blender/editors/transform/transform_snap.c | |
parent | a83bbefec699b60a5f221a55e86998380cceb181 (diff) |
Fix T50148: Header: Wrong rounding when moving frames
Deduplicate the code and use the same logic used to
calculate individual elements in `t->values_final[0]`.
Differential revision: https://developer.blender.org/D6135
Diffstat (limited to 'source/blender/editors/transform/transform_snap.c')
-rw-r--r-- | source/blender/editors/transform/transform_snap.c | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index 9de3dfe0214..4f6c26a6391 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -57,6 +57,7 @@ #include "WM_types.h" #include "ED_image.h" +#include "ED_markers.h" #include "ED_node.h" #include "ED_uvedit.h" #include "ED_view3d.h" @@ -1468,7 +1469,7 @@ bool peelObjectsTransform(TransInfo *t, /** \} */ /* -------------------------------------------------------------------- */ -/** \name Nodes +/** \name snap Nodes * \{ */ static bool snapNodeTest(View2D *v2d, bNode *node, eSnapSelect snap_select) @@ -1589,6 +1590,47 @@ bool snapNodesTransform( r_node_border); } +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name snap Frames + * \{ */ + +/* This function is used by Animation Editor specific transform functions to do + * the Snap Keyframe to Nearest Frame/Marker + */ +void snapFrameTransform(TransInfo *t, + const eAnimEdit_AutoSnap autosnap, + const bool is_frame_value, + const float delta, + float *r_val) +{ + double val = delta; + switch (autosnap) { + case SACTSNAP_STEP: + case SACTSNAP_FRAME: + val = floor(val + 0.5); + break; + case SACTSNAP_MARKER: + /* snap to nearest marker */ + // TODO: need some more careful checks for where data comes from + val = ED_markers_find_nearest_marker_time(&t->scene->markers, (float)val); + break; + case SACTSNAP_SECOND: + case SACTSNAP_TSTEP: { + /* second step */ + const Scene *scene = t->scene; + const double secf = FPS; + val = floor((val / secf) + 0.5); + if (is_frame_value) { + val *= secf; + } + break; + } + } + *r_val = (float)val; +} + /*================================================================*/ static void applyGridIncrement( |