author Campbell Barton Sun, 12 Aug 2012 19:35:47 +0000 (19:35 +0000) committer Campbell Barton Sun, 12 Aug 2012 19:35:47 +0000 (19:35 +0000)
also the compositor bounds (used for scroll bars), were only calculated when pressing the home key in 2.63, how this is updated on draw

index 5b5ccc0582c22caabbfd98acc79b1911069f5a2c..71367bb7df43ede112d89484fb81553b6b4bb501 100644 (file)
@@ -1186,6 +1186,44 @@ struct SmoothView2DStore {
double time_allowed;
};

+/**
+ * function to get a factor out of a rectangle
+ *
+ * note: this doesn't always work as well as it might because the target size
+ *       may not be reached because of clamping the desired rect, we _could_
+ *       attempt to clamp the rect before working out the zoom factor but its
+ *       not really worthwhile for the few cases this happens.
+ */
+static float smooth_view_rect_to_fac(const rctf *rect_a, const rctf *rect_b)
+{
+       float size_a[2] = {rect_a->xmax - rect_a->xmin,
+                                          rect_a->ymax - rect_a->ymin};
+       float size_b[2] = {rect_b->xmax - rect_b->xmin,
+                                          rect_b->ymax - rect_b->ymin};
+       float cent_a[2] = {(rect_a->xmax + rect_a->xmin) * 0.5f,
+                                          (rect_a->ymax + rect_a->ymin) * 0.5f};
+       float cent_b[2] = {(rect_b->xmax + rect_b->xmin) * 0.5f,
+                                          (rect_b->ymax + rect_b->ymin) * 0.5f};
+
+       float fac_max = 0.0f;
+       float tfac;
+
+       int i;
+
+       for (i = 0; i < 2; i++) {
+               /* axis translation normalized to scale */
+               tfac = fabsf(cent_a[i] - cent_b[i]) / fmin(size_a[i], size_b[i]);
+               fac_max = fmax(fac_max, tfac);
+               if (fac_max >= 1.0f) break;
+
+               /* axis scale difference, x2 so doubling or half gives 1.0f */
+               tfac = (1.0f - (fmin(size_a[i], size_b[i]) / fmax(size_a[i], size_b[i]))) * 2.0f;
+               fac_max = fmax(fac_max, tfac);
+               if (fac_max >= 1.0f) break;
+       }
+       return fmin(fac_max, 1.0f);
+}
+
/* will start timer if appropriate */
/* the arguments are the desired situation */
void UI_view2d_smooth_view(bContext *C, ARegion *ar,
@@ -1197,6 +1235,7 @@ void UI_view2d_smooth_view(bContext *C, ARegion *ar,
View2D *v2d = &ar->v2d;
struct SmoothView2DStore sms = {{0}};
short ok = FALSE;
+       float fac = 1.0f;

/* initialize sms */
sms.new_cur = v2d->cur;
@@ -1204,7 +1243,11 @@ void UI_view2d_smooth_view(bContext *C, ARegion *ar,
/* store the options we want to end with */
if (cur) sms.new_cur = *cur;

-       if (C && U.smooth_viewtx) {
+       if (cur) {
+               fac = smooth_view_rect_to_fac(&v2d->cur, cur);
+       }
+
+       if (C && U.smooth_viewtx && fac > FLT_EPSILON) {
int changed = 0; /* zero means no difference */

if (BLI_rctf_compare(&sms.new_cur, &v2d->cur, FLT_EPSILON) == FALSE)
@@ -1218,6 +1261,9 @@ void UI_view2d_smooth_view(bContext *C, ARegion *ar,

sms.time_allowed = (double)U.smooth_viewtx / 1000.0;

+                       /* scale the time allowed the change in view */
+                       sms.time_allowed *= (double)fac;
+
/* keep track of running timer! */
if (v2d->sms == NULL)
v2d->sms = MEM_mallocN(sizeof(struct SmoothView2DStore), "smoothview v2d");
index 07b1faecaef6497cfe9bd29bcf42c8f3024c0ebd..1a4c302124ff320ff1f8036410ffd264b8645440 100644 (file)
@@ -1039,6 +1039,8 @@ static void node_draw(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTre
node->typeinfo->drawfunc(C, ar, snode, ntree, node);
}

+#define USE_DRAW_TOT_UPDATE
+
void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree)
{
bNode *node;
@@ -1046,9 +1048,22 @@ void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeT
int a;

if (ntree == NULL) return;      /* groups... */
-
+
+#ifdef USE_DRAW_TOT_UPDATE
+       if (ntree->nodes.first) {
+               BLI_rctf_init_minmax(&ar->v2d.tot);
+       }
+#endif
+
/* draw background nodes, last nodes in front */
for (a = 0, node = ntree->nodes.first; node; node = node->next, a++) {
+
+#ifdef USE_DRAW_TOT_UPDATE
+               /* unrelated to background nodes, update the v2d->tot,
+                * can be anywhere before we draw the scroll bars */
+               BLI_rctf_union(&ar->v2d.tot, &node->totr);
+#endif
+
if (!(node->flag & NODE_BACKGROUND))
continue;
node->nr = a;        /* index of node in list, used for exec event code */
index 0566611dc0e52eee614a9a6675eb5cc07d1a1d72..4be51a0213798835807dcb52c4a147038191f2c0 100644 (file)
@@ -136,8 +136,6 @@ static int node_view_all_exec(bContext *C, wmOperator *UNUSED(op))
snode->yof = 0;

if (space_node_view_flag(C, snode, ar, 0)) {
-               ED_region_tag_redraw(ar);
-
return OPERATOR_FINISHED;
}
else {
@@ -166,8 +164,6 @@ static int node_view_selected_exec(bContext *C, wmOperator *UNUSED(op))
SpaceNode *snode = CTX_wm_space_node(C);

if (space_node_view_flag(C, snode, ar, NODE_SELECT)) {
-               ED_region_tag_redraw(ar);
-
return OPERATOR_FINISHED;
}
else {
@@ -168,7 +168,7 @@ typedef struct bNode {
void *storage;                  /* custom data, must be struct, for storage in file */
struct bNode *original; /* the original node in the tree (for localized tree) */

-       float locx, locy;               /* root offset for drawing */
+       float locx, locy;               /* root offset for drawing (parent space) */
float width, height;    /* node custom width and height */
float miniwidth;                /* node width if hidden */
float offsetx, offsety; /* additional offset from loc */
@@ -181,7 +181,7 @@ typedef struct bNode {

short need_exec, exec;  /* need_exec is set as UI execution event, exec is flag during exec */
-       rctf totr;                              /* entire boundbox */
+       rctf totr;                              /* entire boundbox (worldspace) */
rctf butr;                              /* optional buttons area */
rctf prvr;                              /* optional preview area */
bNodePreview *preview;  /* optional preview image */
index ab533b2859b560c1b3e5d521db8321c61ca106b2..a3f4b362672d27bdb7e1ca3944d1a96654586185 100644 (file)
@@ -104,6 +104,7 @@ typedef struct View2D {

/* general refresh settings (v2d->flag) */
/* global view2d horizontal locking (for showing same time interval) */
+       /* TODO: this flag may be set in old files but is not accessible currently, should be exposed from RNA - Campbell */
#define V2D_VIEWSYNC_SCREEN_TIME       (1<<0)
/* within area (i.e. between regions) view2d vertical locking */
#define V2D_VIEWSYNC_AREA_VERTICAL     (1<<1)