Fix T41457: Viewport resolution divider does freestyle for every resolution
authorSergey Sharybin <sergey.vfx@gmail.com>
Tue, 19 Aug 2014 13:36:49 +0000 (19:36 +0600)
committerSergey Sharybin <sergey.vfx@gmail.com>
Tue, 19 Aug 2014 13:39:13 +0000 (19:39 +0600)
Now freestyle would be rendered for the final resolution only, making it so
viewport navigation is really interactive.

source/blender/editors/render/render_internal.c
source/blender/render/extern/include/RE_pipeline.h
source/blender/render/intern/source/pipeline.c

index 7eb3b5f88821a175124b460d44eabaaf42d953d3..baf25a49f7c0b1c36ff09c0d928178dbabf8a7a9 100644 (file)
@@ -1032,6 +1032,7 @@ typedef struct RenderPreview {
 
        int start_resolution_divider;
        int resolution_divider;
+       bool has_freestyle;
 } RenderPreview;
 
 static int render_view3d_disprect(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D *rv3d, rcti *disprect)
@@ -1150,6 +1151,15 @@ static void render_update_resolution(Render *re, const RenderPreview *rp,
        else {
                RE_ChangeResolution(re, winx, winy, NULL);
        }
+
+       if (rp->has_freestyle) {
+               if (rp->resolution_divider == 1) {
+                       RE_ChangeModeFlag(re, R_EDGE_FRS, false);
+               }
+               else {
+                       RE_ChangeModeFlag(re, R_EDGE_FRS, true);
+               }
+       }
 }
 
 static void render_view3d_startjob(void *customdata, short *stop, short *do_update, float *UNUSED(progress))
@@ -1163,7 +1173,7 @@ static void render_view3d_startjob(void *customdata, short *stop, short *do_upda
        bool orth, restore = 0;
        char name[32];
        int update_flag;
-       bool use_border = false;
+       bool use_border;
 
        update_flag = rp->engine->job_update_flag;
        rp->engine->job_update_flag = 0;
@@ -1429,6 +1439,7 @@ static void render_view3d_do(RenderEngine *engine, const bContext *C)
        rp->bmain = CTX_data_main(C);
        rp->resolution_divider = divider;
        rp->start_resolution_divider = divider;
+       rp->has_freestyle = scene->r.mode & R_EDGE_FRS;
        copy_m4_m4(rp->viewmat, rp->rv3d->viewmat);
        
        /* clear info text */
index 4ab0f5a234d1a397214cb173ab940182b751dfdf..3b54de4c943bd4a36a41e77af6a710fa9e03bc86 100644 (file)
@@ -194,6 +194,7 @@ void RE_InitState(struct Render *re, struct Render *source, struct RenderData *r
                   struct SceneRenderLayer *srl,
                   int winx, int winy, rcti *disprect);
 void RE_ChangeResolution(struct Render *re, int winx, int winy, rcti *disprect);
+void RE_ChangeModeFlag(struct Render *re, int flag, bool clear);
 
 /* set up the viewplane/perspective matrix, three choices */
 struct Object *RE_GetCamera(struct Render *re); /* return camera override if set */
index aaaa53bd54c5e489e25d9516a10a97b712c76a0a..77059f1b99833e194cd1e9a8bf8900d792037d21 100644 (file)
@@ -736,6 +736,20 @@ void RE_ChangeResolution(Render *re, int winx, int winy, rcti *disprect)
        }
 }
 
+/* TODO(sergey): This is a bit hackish, used to temporary disable freestyle when
+ * doing viewport render. Needs some better integration of BI viewport rendering
+ * into the pipeline.
+ */
+void RE_ChangeModeFlag(Render *re, int flag, bool clear)
+{
+       if (clear) {
+               re->r.mode &= ~flag;
+       }
+       else {
+               re->r.mode |= flag;
+       }
+}
+
 /* update some variables that can be animated, and otherwise wouldn't be due to
  * RenderData getting copied once at the start of animation render */
 void render_update_anim_renderdata(Render *re, RenderData *rd)